当WHERE子句中有与该列的比较时,不使用TIMESTAMP列的索引

时间:2019-04-02 13:00:41

标签: mysql sql database indexing

有两个表,如:

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查询创建更好的索引吗?

1 个答案:

答案 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,

如果您真的希望它使用索引,则可能需要使其覆盖一下,这意味着您需要将这些列添加到索引中