针对带IN子句的SQL查询的MYSQL查询优化

针对带IN子句的SQL查询的MYSQL查询优化,mysql,sql,performance,Mysql,Sql,Performance,下面是基于用户输入动态构造的SQL查询。而只要IN参数小于50,查询的性能就相当好。然而,只要IN列表增长,查询响应时间就会显著降低 我曾经尝试过在多个查询中用较小的输入拆分查询,并并行启动所有查询。这无疑给了我更好的性能 不过,我想避免拆分查询,我想知道是否有其他(更好的)方法可以进一步优化此查询(我想是否可以通过某种方式创建临时表来使用join) [请注意col1和col2已经是索引] SELECT a.col3, b.col5, b.col4, ... FROM A a JOIN B

下面是基于用户输入动态构造的SQL查询。而只要IN参数小于50,查询的性能就相当好。然而,只要IN列表增长,查询响应时间就会显著降低

我曾经尝试过在多个查询中用较小的输入拆分查询,并并行启动所有查询。这无疑给了我更好的性能

不过,我想避免拆分查询,我想知道是否有其他(更好的)方法可以进一步优化此查询(我想是否可以通过某种方式创建临时表来使用join)

[请注意col1和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 

MySQL很好地处理了带有常量的查询中的
。与许多其他数据库不同,它实际上对输入进行排序,并使用二叉树进行搜索。因此,我的猜测是数据量是问题所在,而不是
本身的
。并行线程工作得更好的事实正好说明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)
上建立索引。多列索引可以帮助处理
中的
,但只对其中一列有帮助,因此索引中的第二列应该更具选择性。

MySQL在处理带有常量的
查询中的
方面做得很好。与许多其他数据库不同,它实际上对输入进行排序,并使用二叉树进行搜索。因此,我的猜测是数据量是问题所在,而不是
本身的
。并行线程工作得更好的事实正好说明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)
上建立索引。多列索引可以帮助处理
中的
,但只对其中一列有帮助,因此索引中的第二列应该更具选择性。

用这些参数创建一个临时表,并在itON a.apk=b.afk和a.bfk=b.bpk上进行联接……至少基于两个不同的列联接这两个表对吗,有关查询性能的问题始终需要对所有相关表和解释结果使用正确的CREATE语句。使用这些参数创建一个临时表,并在itON a.apk=b.afk和a.bfk=b.bpk上进行联接……是否至少基于两个不同的列联接这两个表,关于查询性能的问题总是需要对所有相关表和解释结果使用适当的CREATE语句。