mysql的IN查询优化
mysql的IN里面的数量太大,比如大于1千时,查询的性能就会差很多。
有以下的解决方法。
解决方法一:拆分IN的数量
IN 数量超过1千,就拆成多条 sql, 每条sql的IN数量不超过1千。
用OR或者UNION进行SQL改写。
也可以使用 Java写代码,把 IN 数量进行拆分,每条sql的IN数量不超过1千。多次执行。
比如使用 IN 的sql 是
SELECT 字段1 FROM 表名 WHERE 字段2 IN (1,2,3,4,5,...2000)
可以替换成:
SELECT 字段1 FROM 表名 WHERE 字段2 IN (1,2,3,4,5,...1000)
UNION ALL
SELECT 字段1 FROM 表名 WHERE 字段2 IN (1001,1002,...2000)
这个方法有个缺点,就是如果 IN 里面的数量太大,比如1万,那么就需要拼接10次。。
解决方法二 :使用 JOIN(关联查询)来代替 IN
可以给字段加上索引,然后使用 JOIN(关联查询)
比如使用 IN 的sql 是:
SELECT 字段 FROM 表名1
WHERE 字段1 IN (SELECT 字段2 FROM 表名2);
可以用关联查询代替为:
SELECT 字段 FROM 表名1
JOIN 表名2
ON 表名1.字段1=表名2.字段2
解决方法三 :使用临时表
创建临时表,当你断开与数据库的连接后,临时表就会自动被销毁。 临时表只在当前连接中有效。
还可以给字段加上索引。
格式:
CREATE TEMPORARY TABLE 临时表名 (id int auto_increment primary key ,
字段名 VARCHAR(长度),
INDEX idx_索引名 (字段名));
然后将表的数据,插入到临时表,格式如下:
INSERT INTO 临时表名(字段名) SELECT 字段 FROM 表名;
然后,再使用OR 或者 JOIN 关联查询。
示例:
CREATE TEMPORARY TABLE temp_table_order (id int auto_increment primary key ,
order_id VARCHAR(32),
INDEX idx_order_id (order_id));
INSERT INTO temp_table_order(order_id) SELECT order_id FROM tb_order_detail_test;
SELECT * FROM tb_order_test tb
JOIN temp_table_order tt
ON tb.id=tt.order_id;
如果是比较重要的数据,也可以使用普通的表,持久保存。
参考资料:
分类:
A1--mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-06-23 LeetCode回溯算法的解题思路