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

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

我对一个大表(大约3700万行)有一个非常简单的查询。这个查询需要10分钟才能运行,而且应该很快,因为索引构建正确(我认为)。我不明白为什么这个查询要花这么长时间。我希望有人能指引我正确的方向:
查询:

  1. select type_id, sub_type_id, max(settlement_date_time) as max_dt
  2. from transaction_history group by type_id, sub_type_id

创建语句:

  1. CREATE TABLE `transaction_history` (
  2. `transaction_history_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `type_id` int(11) NOT NULL,
  4. `sub_type_id` int(11) DEFAULT NULL,
  5. `settlement_date_time` datetime DEFAULT NULL,
  6. PRIMARY KEY (`transaction_history_id`),
  7. KEY `sub_type_id_idx` (`sub_type_id_id`),
  8. KEY `settlement_date` (`settlement_date_time`),
  9. KEY `type_sub_type` (`type_id`,`sub_type_id`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=36832823 DEFAULT CHARSET=latin1;

解释结果:

  1. id -> 1
  2. select_type -> SIMPLE
  3. table -> transaction_history
  4. type -> index
  5. possible_keys -> NULL
  6. key -> type_sub_type
  7. key_len -> 9
  8. ref -> NULL
  9. rows -> 37025337
  10. filtered -> 100.00
  11. Extra ->

为什么可能的密钥为空?它说它正在使用一个索引,但似乎不是这样。为什么ref为空?如何提高查询效率?索引有问题吗?我必须更改mysql配置文件中的任何值吗?
谢谢您

lokaqttq

lokaqttq1#

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

  1. 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

相关问题