我有两个完全相同的表,除了一个表具有时间戳值列,另一个表具有日期时间值列。索引是相同的。值是相同的。
但是当我运行SELECT station, MAX(timestamp) AS max_timestamp FROM stations GROUP BY station;时,如果stations是有时间戳的那个,它执行得非常快,如果我尝试使用datetime,我还没有看到一个查询被执行。在这两种情况下,都对timestamp列进行了索引,只是类型发生了变化。
我应该从哪里开始寻找呢?或者datetime只是不适合搜索和索引?
以下是EXPLAIN提供的功能:
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| 1 | SIMPLE | stations | range | NULL | stamp | 33 | NULL | 1511 | Using index for group-by |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
+----+-------------+--------+-------+---------------+---------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+------+---------+-------+
| 1 | SIMPLE |stations2 | index | NULL | station | 2 | NULL | 3025467 | |
+----+-------------+--------+-------+---------------+---------+---------+------+---------+-------+和SHOW
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stations | CREATE TABLE `stations` (
`station` varchar(10) COLLATE utf8_bin DEFAULT NULL,
`available` smallint(6) DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `stamp` (`station`,`timestamp`),
KEY `time` (`timestamp`),
KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stations2 | CREATE TABLE `stations2` (
`station` smallint(5) unsigned NOT NULL,
`available` smallint(5) unsigned DEFAULT NULL,
`timestamp` datetime DEFAULT NULL,
KEY `station` (`station`),
KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+发布于 2012-05-26 00:58:08
您可以从解释中看到,没有使用键进行选择(对于possible_keys,为NULL)。您没有WHERE子句,所以这是有意义的。
MySQL可以利用索引来确定MAX,并且可以利用索引来优化GROUP BY。但是,为了能够优化两者的组合,需要MAX()函数中的列和GROUP BY子句中的列都在复合索引中。在第一个表中,您将这个复合索引作为一个名为'stamp‘的唯一键。解释结果显示MySQL正在使用该索引。
在第二个表中,您没有这个复合索引,因此MySQL必须执行更多的工作。它必须手动对结果进行分组,并通过手动扫描每行来保持每个工作站的最大值。如果您在第二个表中添加相同的复合索引,您将看到这两个表之间的性能相似。
但是,TIMESTAMP仍将略微优于DATETIME,因为TIMESTAMP被视为一个4字节的整数值,其处理速度比8字节的特殊DATETIME值快。数据集越大,您看到的差异就越大。
https://stackoverflow.com/questions/10753832
复制相似问题