我有一个需要很长时间才能处理的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')
我需要这个查询的索引。提前谢谢!
答案 0 :(得分:0)
没有索引真的会有所帮助。
将其更改为: -
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上添加一个索引。在3列上添加另一个索引,Col2,Col3和Col4
您的问题是MySQL只能在查询中出现表时使用一个索引。因此,使用您的OR,它无法使用有用的索引。这会使用Table1的出现将其分为2个查询,因此它可以在每个查询上使用索引。
答案 1 :(得分:0)
要使您的查询计划使用索引,您可能需要创建多个索引,并将谓词中的“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的输出,验证每个子查询是否可以使用索引。