大型数据库中不使用mysql索引

hgqdbh6s  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(429)

我对一个大表(大约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配置文件中的任何值吗?
谢谢您

lokaqttq

lokaqttq1#

(向两位已经给出必要答案的评论人士致歉 INDEX ; 我会尽量说更多的话来证明给出‘答案’是合理的。)
使用“复合”(和“覆盖”)索引:

INDEX(type_id, sub_type_id, settlement_date_time)

根本没有 WHERE ,因此无需担心此类列。首先是按中所列顺序排列的列 GROUP BY ,然后是另一列。优化器可能会非常高效地跳过索引。
为什么? NULL ? 两列索引是没有用的。一般来说,如果需要查看表的20%以上,最好是简单地扫描表,而不是在索引btree和数据btree之间跳转。
更多提示:http://mysql.rjweb.org/doc.php/index_cookbook_mysql

相关问题