需要索引来加速MySQL查询
我有一个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
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)