mysql - 需要索引来加速 MySQL 查询

标签 mysql indexing

我有一个需要很长时间才能处理的 MySQL 查询。

 Select Count(*) from Table1 
 Where Col1='abc'
 Or (Col2='xyz' And Col3='mnl' And Col4='efg')
 Or (Col2='xyz' And Col3='mnl' And Col5='ijk')

我需要这个查询的索引。提前致谢!

最佳答案

要让查询计划使用索引,您可能需要创建多个索引,并将谓词中的“OR”条件分解为单独的查询,并使用 UNION ALL 运算符组合结果.

SELECT SUM(cnt) AS cnt
  FROM ( 
         SELECT SUM(1) AS cnt
           FROM Table1
          WHERE Col1 = 'abc'
          UNION ALL
         SELECT COUNT(1) AS cnt
           FROM Table1
          WHERE Col2='xyz'
            AND Col3='mnl'
            AND (Col4='efg' OR Col5='ijk')
            AND NOT (Col1 <=> 'abc')
       ) s

注意:使用“UNION ALL”运算符,以避免在两个查询碰巧返回相同值的极端情况下将计数减少一半,并确保在第二个查询中包含对 Col1 的不等式测试,所以行不会被重复计算。

这些应该足以覆盖索引:

CREATE INDEX Table1_IX1 ON Table1 (Col1)

CREATE INDEX Table1_IX2 ON Table1 (Col2,Col3,Col4,Col5,Col1)

通过检查 EXPLAIN 的输出来验证每个子查询是否可以使用索引。

关于mysql - 需要索引来加速 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17658719/

相关文章:

php - 避免mysql中的每一行

algorithm - lucene如何索引文件?

arrays - 无法在Elasticsearch数组中建立索引

mysql - 如何修复mysql中的 "right syntax to use near ' as begin“错误?

php - 如何在 laravel 的 if 语句中显示值

java - hibernate - 为mysql连接创建字符串类型的主键

MySQL 'Too many keys' 错误

arrays - 使用模数运算符重置索引如何工作?

algorithm - 您如何为快速搜索编制索引文件?

php - 使用 fputcsv 连接列