mysql 中 in 大量 id 该怎样优化

2018-11-20 16:59:40 +08:00
 cc959798

比如 where id in (...),如果里面几条或者十几条还是很快的,但是我们需要一次查出上万条不同 id 的数据,该怎办,这时候 explain 显示的全表扫了

8144 次点击
所在节点    MySQL
26 条回复
mayday526
2018-11-20 17:55:00 +08:00
用 in 查询的那个字段加上索引试试
utf16
2018-11-20 17:57:31 +08:00
exists 了解一下
lucn
2018-11-20 17:59:23 +08:00
拆分成多个查询呗,每次少查点,id 是主键的话,上万个主键查找,查询引擎优化成表扫描不是很正常么
sfqtsh
2018-11-20 18:00:05 +08:00
in 几万几十万 走索引也不是很快了,,pg
limuyan44
2018-11-20 18:12:44 +08:00
优化完就直接扫表了,能同时查肯定有业务特征的啊,加个字段吧。
dezhou9
2018-11-20 18:22:49 +08:00
字典树匹配
mmdsun
2018-11-20 18:52:52 +08:00
in MySQL 默认有一定的优化。我看是 in 太多了 MySQL 判断不走索引了。可以强制索引:select * from table force index(索引)
Raymon111111
2018-11-20 19:48:27 +08:00
for 循环分批
littleylv
2018-11-20 20:05:26 +08:00
分页?
Immortal
2018-11-20 20:08:20 +08:00
2l 给思路了 有个 in 和 exists 转化的 具体 google 下
cc959798
2018-11-20 20:11:16 +08:00
@mayday526 id 是主键呀
cc959798
2018-11-20 20:11:47 +08:00
@mmdsun 这样好像也不走索引
zhangZMZ
2018-11-20 20:24:32 +08:00
force index
zhangZMZ
2018-11-20 20:24:49 +08:00
mysql 在 10W 以内是没问题的
JaguarJack
2018-11-20 21:07:36 +08:00
分批次走索引吧
HuHui
2018-11-20 21:10:33 +08:00
先从业务入手吧
jimrok
2018-11-20 21:14:02 +08:00
用 nosql,memcached 和 redis 都有类似的方法,可以一次返回多个 key 的数据。上万个,你这个业务也有点问题吧?难道每次不做分页?
yidinghe
2018-11-20 21:15:41 +08:00
因为要扫描的记录数量确实有这么多,这时候索引已经没有办法继续帮助优化扫描过程了。那么一种策略就是尽快返回。查询 id 的语句执行完后,一边从 cursor 取 id,一边分批次对这些 id 做后面的操作。
lxerxa
2018-11-20 21:36:45 +08:00
考虑用 exists
cc959798
2018-11-20 21:41:05 +08:00
@lxerxa 这种方式好像用不到子查询,没法改成 exists

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509695

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX