mysql 千万级别的 in 查询优化

嘿嘿,你说的情况我也遇到过。
上周,一位客户问我为什么 IN 查询很慢。
原来这个主键索引已经浪费了。
比如我2 02 3 年在上海的一个商场做的一个电商项目,订单有几千万的数据。
测试发现,当使用IN(1 ,2 ,3 )检查几十个标识符时,EXPLAIN实际上显示没有索引。
但当换成几乎占据整个表标识符的IN(1 , 2 , ..., 9 9 9 9 9 9 )时,时间爆炸——完全直接扫描表,CPU上升到2 00%。

MySQL的逻辑其实有点奇怪。
你可能会觉得IN中的ID太多,维护临时表的成本比直接扫描表要高。
这里的问题是我尝试将 IN 拆分为三个子查询并使用 UNION ALL,然后连接临时表。
性能实际上更好。
但这种方案需要测试数据大小限制,太小的输入输入并不划算。

你提到的临时表分区解决方案听起来不错,但我没有尝试过。
如果使用缓存遍历的话,前提是你的IN中的标识符是静态常量吧?如果是动态的,缓存就没啥用了。

mysql 千万级数据 优化查询速度

SQL查询慢其实和LIKE '%abc%'有关。
索引基本上是徒劳的。

索引完全没用,就像从头开始搜索“%xxx%”一样。
必须扫描整个数据库。

拆分表是解决办法,但是拆分成几十个表就太多了。
亲自检查一下。

数据很多吗?如果数量很大,就没有可能扫描整个表。
用户ID是固定的吗?
建议添加用户ID=?指定条件并使用userid作为索引。
这是第一位的。