MySQL似乎忽略了datetime列上的索引

时间:2016-05-04 10:39:45

标签: mysql

在比较或操作MySQL表中的两个日期时间列时,我遇到了非常严重的性能问题。我有一张表tbl,大约有1000万行。它看起来像这样:

`id` int(11) NOT NULL AUTO_INCREMENT,
`last_interaction` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
`last_maintenence` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
PRIMARY KEY (`id`),
KEY `last_maintenence_idx` (`last_maintenence`),
KEY `last_interaction_idx` (`last_interaction`),
ENGINE=InnoDB AUTO_INCREMENT=12389814 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

当我运行此查询时,执行大约需要一分钟:

SELECT id FROM tbl
WHERE last_maintenence < last_interaction
ORDER BY last_maintenence ASC LIMIT 200;

描述查询呈现:

          id: 1
  select_type: SIMPLE
        table: tbl
         type: index
possible_keys: NULL
          key: last_maintenence_idx
      key_len: 5
          ref: NULL
         rows: 200
        Extra: Using where

看起来MySQL没有找到/使用last_interaction上的索引。有谁知道为什么会这样,以及如何触发它?

3 个答案:

答案 0 :(得分:1)

这是因为mysql通常每个表只使用一个索引。不幸的是你的查询看起来很简单。解决方案是创建一个涉及两列的复合索引。

答案 1 :(得分:1)

您提供的查询需要全表扫描。 必须检查每条记录以符合您的条件last_maintenence < last_interaction。 因此,搜索时不使用索引。

仅使用索引last_maintenence_idx,因为您希望按其排序结果。

答案 2 :(得分:1)

这很容易:错误1号。

MySQL(大多数情况下)每个查询只能使用一个索引,优化器会查找哪个更适合使用。

因此,您必须使用两个字段创建复合索引。