我对一个大表(大约3700万行)有一个非常简单的查询。这个查询需要10分钟才能运行,而且应该很快,因为索引构建正确(我认为)。我不明白为什么这个查询要花这么长时间。我希望有人能指引我正确的方向:
查询:
select type_id, sub_type_id, max(settlement_date_time) as max_dt
from transaction_history group by type_id, sub_type_id
创建语句:
CREATE TABLE `transaction_history` (
`transaction_history_id` int(11) NOT NULL AUTO_INCREMENT,
`type_id` int(11) NOT NULL,
`sub_type_id` int(11) DEFAULT NULL,
`settlement_date_time` datetime DEFAULT NULL,
PRIMARY KEY (`transaction_history_id`),
KEY `sub_type_id_idx` (`sub_type_id_id`),
KEY `settlement_date` (`settlement_date_time`),
KEY `type_sub_type` (`type_id`,`sub_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=36832823 DEFAULT CHARSET=latin1;
解释结果:
id -> 1
select_type -> SIMPLE
table -> transaction_history
type -> index
possible_keys -> NULL
key -> type_sub_type
key_len -> 9
ref -> NULL
rows -> 37025337
filtered -> 100.00
Extra ->
为什么可能的密钥为空?它说它正在使用一个索引,但似乎不是这样。为什么ref为空?如何提高查询效率?索引有问题吗?我必须更改mysql配置文件中的任何值吗?
谢谢您
1条答案
按热度按时间lokaqttq1#
(向两位已经给出必要答案的评论人士致歉
INDEX
; 我会尽量说更多的话来证明给出‘答案’是合理的。)使用“复合”(和“覆盖”)索引:
根本没有
WHERE
,因此无需担心此类列。首先是按中所列顺序排列的列GROUP BY
,然后是另一列。优化器可能会非常高效地跳过索引。为什么?
NULL
? 两列索引是没有用的。一般来说,如果需要查看表的20%以上,最好是简单地扫描表,而不是在索引btree和数据btree之间跳转。更多提示:http://mysql.rjweb.org/doc.php/index_cookbook_mysql