使用IN子句进行SQL查询的MYSQL查询优化

时间:2016-04-26 10:21:47

标签: mysql sql performance

我有以下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 

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,但仅适用于其中一个,因此选择性越高,应该是索引中的第二列。