首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个几乎相同的表之间的性能差异

问两个几乎相同的表之间的性能差异
EN

Stack Overflow用户
提问于 2012-05-25 19:43:54
回答 1查看 68关注 0票数 0

我有两个完全相同的表,除了一个表具有时间戳值列,另一个表具有日期时间值列。索引是相同的。值是相同的。

但是当我运行SELECT station, MAX(timestamp) AS max_timestamp FROM stations GROUP BY station;时,如果stations是有时间戳的那个,它执行得非常快,如果我尝试使用datetime,我还没有看到一个查询被执行。在这两种情况下,都对timestamp列进行了索引,只是类型发生了变化。

我应该从哪里开始寻找呢?或者datetime只是不适合搜索和索引?

以下是EXPLAIN提供的功能:

代码语言:javascript
复制
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| 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

代码语言:javascript
复制
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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值快。数据集越大,您看到的差异就越大。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10753832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档