有两个表,如:
FOO(ID, A, B, C, D, E, G(timestamp))
BAR(ID, X, Y, Z, FK_FOO_ID, W)
并且具有index
,例如:
CREATE INDEX IDX_TEST ON FOO(G)
以下DESCRIBE
查询将不使用创建的索引:
DESC SELECT F.A, F.B, F.C, F.D, F.E,
SUM(CASE WHEN B.X IN (0, 12) THEN B.Y ELSE 0.00 END) AS 'Something_1',
SUM(CASE WHEN B.X IN (0, 12) THEN B.Z ELSE 0.00 END) AS 'Something_2',
SUM(CASE WHEN B.X = 2 THEN B.Y ELSE 0.00 END) AS 'Something_3',
SUM(CASE WHEN B.X = 2 THEN B.Z ELSE 0.00 END) AS 'Something_4'
FROM FOO AS F
INNER JOIN BAR AS B ON F.ID = B.FK_FOO_ID
WHERE
(F.G > '2018-03-01 23:59:59' OR F.G IS NULL) AND
B.W <= '2018-03-01 23:59:59' AND
B.X IN (0, 2, 12)
GROUP BY
F.A,
F.B,
F.C,
F.D,
F.E;
但要从F.G > '2018-03-01 23:59:59'
子句中删除 WHERE
,将应用创建的索引 。有什么想法吗?如何“强制” MYSQL使用G
类型的列TIMESTAMP
上的索引?有什么想法可以建议使用这种类型的SELECT
查询创建更好的索引吗?
答案 0 :(得分:0)
优化器根据统计信息决定是否使用索引,这意味着该列中不同值的出现频率。
在您删除F.G>'2018-03-01 23:59:59'条件的情况下,剩下的条件只是检查是否为null,这是更常见的值。
此外,当检查null时,它不会检查列中的值本身,而是对每一行都有一点告诉它列中的值是否为null。这样可以使其更快。
当您重新添加条件时,首先找到匹配的ID,然后检查G是否匹配,可能会更快。
它还将使用主键,因为它需要使用它来获取
的值。F.A, F.B, F.C, F.D, F.E,
如果您真的希望它使用索引,则可能需要使其覆盖一下,这意味着您需要将这些列添加到索引中