
项目有个需求 要用多个(目前测试为 1000 多)手机号去查找所属人员,where in () 里多达 1000 多个手机号,导致查询速度非常慢,有什么可以优化的地方吗
1 linauror 2016-07-13 18:05:04 +08:00 加索引呢 |
&bsp; 2 Volio 2016-07-13 18:05:47 +08:00 手机号给个索引试试 |
4 F281M6Dh8DXpD1g2 2016-07-13 18:09:31 +08:00 把这 1000 多手机号建个表写进去,手机号建成主键 ,然后查询的时候 join 下 |
5 hpeng 2016-07-13 18:14:37 +08:00 via iPhone 针对手机号函数索引。 |
6 baiyi OP 跟同事讨论了下 觉得数据结构造成了这种查询语句是不科学的,而且还无法改变结构,索引也加了 效果不好,结贴了 想一想其他的方向 |
7 harborM 2016-07-13 20:02:15 +08:00 之前我的业务也做到一个 in 千量级的 sql 语句,也没什么办法 |
8 loading 2016-07-13 20:07:38 +08:00 via Android 你数据库一共有多少条手机号码。 |
9 OP |
10 loading 2016-07-13 20:45:09 +08:00 via Android 另一个表有多少条呢? |
11 hbprotoss 2016-07-13 20:58:36 +08:00 执行计划能放上来麽 |
12 heaton_nobu 2016-07-13 22:20:58 +08:00 用 join 会快很多 |
13 realpg PRO 非常慢是多慢? |
14 jswh 2016-07-13 23:39:46 +08:00 超长的 in 查询要么和上面网友说的一样用 join 的方式做交集,要么就直接接搜索引擎吧, sphinx 或者 elasticsearch |
15 fatpa 2016-07-14 03:07:35 +08:00 explain 看看 select 的结果先把 |
16/span> ahm 2016-07-14 08:48:08 +08:00 把一千个号码建个视图,然后用 left join 会不会快些呢 |
17 ahm 2016-07-14 08:49:56 +08:00 然后再号码上建立索引 |
18 baiyi OP 感谢~ 目前进展是发现了 mysql5.7 能提高效率.从 9s 到 1.6s.... |
19 Asan 2016-07-14 09:33:25 +08:00 程序分批处理呢? |
21 Lao9 2016-07-14 10:08:57 +08:00 in-list ,就是构建数组跟基表进行类似索引联合的查询行为,这个依靠具体的数据库。如果没有类似功能、你可以自己手工实现类似的工作。否则数据库自己会去做这个事情无需操心 |
22 shakusi 2016-07-14 11:23:17 +08:00 你这(目前测试为 1000 多)些号码有没有一些共同的规律,比如属于哪些段( 13700001001~13700002001 )这种,或者号码属于哪些区域,如果 where 条件后面加 in ,你的 SQL 语句不是也很长? 能否换个思路,把 8000 条数据取出来,然后通过程序去过滤掉这 1000 条出来,比较下性能哪个更快? |
23 wander2008 2016-07-14 11:25:32 +08:00 via iPhone in 里面 1000 多个值… |
24 billgreen1 2016-07-14 11:44:14 +08:00 1. 把你的表结构贴出来 2. 把你的 sql 语句贴出来 按道理没这么慢的,我现在从 6million 中查 2000 个都在 0.0X 秒 |
25 loading 2016-07-14 12:34:49 +08:00 via Android 居然是 9s ……不是语句有问题就是机器有问题 |
26 baiyi OP |