Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要索引来加速MySQL查询_Mysql_Indexing - Fatal编程技术网

需要索引来加速MySQL查询

需要索引来加速MySQL查询,mysql,indexing,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') 我需要这个查询的索引。提前谢谢 没有任何指数能真正帮助这一点 将其更改为:- SELECT Count(*) FROM ( SELECT * FROM

我有一个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')

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

没有任何指数能真正帮助这一点

将其更改为:-

SELECT Count(*) 
FROM
(
    SELECT *
    FROM Table1 
    WHERE Col1='abc'
    UNION
    SELECT *
    FROM Table1 
    WHERE (Col2='xyz' And Col3='mnl' And Col4='efg')
    Or (Col2='xyz' And Col3='mnl' And Col5='ijk')
) Sub1
然后在Col1列上添加一个索引。在Col2、Col3和Col4三列上添加另一个索引


您的问题是MySQL只能对查询中出现的表使用一个索引。因此,对于OR,它不能使用有用的索引。这将使用Table1的一个匹配项将其拆分为两个查询,因此它可以在每个查询上使用索引。

要使查询计划使用索引,您可能需要创建多个索引,并将谓词中的“或”条件分解为单独的查询,并将结果与
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

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

我们需要一匹免费的小马和无限量的比萨饼。
CREATE INDEX Table1_IX1 ON Table1 (Col1)

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