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