项目有个需求 要用多个(目前测试为 1000 多)手机号去查找所属人员,where in () 里多达 1000 多个手机号,导致查询速度非常慢,有什么可以优化的地方吗
1
linauror 2016-07-13 18:05:04 +08:00 ![]() 加索引呢
|
![]() |
2
Volio 2016-07-13 18:05:47 +08:00 ![]() 手机号给个索引试试
|
![]() |
4
liprais 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
baiyi 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 2016-07-13 23:18:52 +08:00 ![]() 非常慢是多慢?
|
![]() |
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
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 |