0

我有一个需要很长时间才能处理的 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')

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

4

2 回答 2

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 的输出,验证每个子查询是否可以使用索引。

于 2013-07-15T16:15:26.323 回答
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,它不能使用有用的索引。这会将其拆分为 2 个查询,每个查询都使用 Table1 的出现,因此它可以在每个查询上使用一个索引。

于 2013-07-15T16:11:53.557 回答