我有以下SQL查询,我根据用户输入动态构建。虽然只要IN参数<1,查询就可以很好地执行。 50.但是,只要IN列表增长,查询响应时间就会显着降低。
我尝试在多个查询中使用小输入拆分查询并同时触发所有查询。这绝对能让我获得更好的性能
但是我想避免拆分查询,想知道是否有任何其他(更好)的方式我可以进一步优化这个查询(我想如果通过某种程度我可以通过创建临时表来使用连接)
[请注意col1&amp; col2已经是一个索引]
SELECT a.col3, b.col5, b.col4, ...
FROM A a
JOIN B b ON a.apk = b.afk AND a.bfk = b.bpk
WHERE a.col1 IN (1, 2, 3, ...)
AND a.col2 IN ('abc', 'pqr', ...)
AND a.flag = 1
答案 0 :(得分:0)
MySQL在使用常量处理IN
查询时做得很好。与许多其他数据库不同,它实际上对输入进行排序并使用二叉树进行搜索。所以,我的猜测是数据量是问题,而不是IN
本身。并行线程工作得更好的事实说明MySQL不会将所有可用资源用于单个查询。
您可以尝试索引。对于此查询:
SELECT a.col3, b.col5, b.col4, ...
FROM A a JOIN
B b
ON a.apk = b.afk AND a.bfk = b.bpk
WHERE a.col1 IN (1, 2, 3, ...) AND
a.col2 IN ('abc', 'pqr', ...) AND
a.flag = 1 ;
您想要b(fk, bpk)
以及a(flag, col1, col2)
或a(flag, col2, col1)
上的索引。多列索引可以帮助IN
,但仅适用于其中一个,因此选择性越高,应该是索引中的第二列。