技术CTO-关注编程入门知识,提供编程入门教程

您的位置: 首页 > 数据库 > mysql > 正文

COUNT(*) 怎么这么慢呢?

来源: 技术CTO 阅读:

mysql INNODB
两个表 test_a test_b
id都是自增字段,主键
SELECT  COUNT(*) 
FROM test_a a JOIN test_b b
ON a.id=b.id

竟然用了25秒

数据量多少?执行计划贴下
以文本方式贴出 
explain select ...
show index from ..
以供分析。
忘了说了 各插入了200万数据


EXPLAIN

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b index PRIMARY idx_user_id 9 \N 2381074 Using index
1 SIMPLE a eq_ref PRIMARY PRIMARY 8 test.b.id 1 Using index

b表居然没用PRIMARY
用了别的索引
执行了20几秒
你对索引有点误解,从100w行里找出1行索引是快的,如果是找50w行,索引是慢的,下面这句的查询方式必定要扫描全部索引节点。

引用 3 楼 giftsf 的回复:
忘了说了 各插入了200万数据


EXPLAIN

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b index PRIMARY idx_user_id 9 \N 2381074 Using index
1 SIMPLE a eq_ref PRIMARY PRIMARY 8 test.b.id 1 Using index

b表居然没用PRIMARY
用了别的索引
执行了20几秒
当你的扫描数据在表中是绝大多数记录的情况下, 这时mysql会 判定走全表扫描比走索引可能更合适
我改成
SELECT  COUNT(*) 
FROM test_a a JOIN test_b b FORCE INDEX(PRIMARY)
ON a.id=b.id
 这样能10秒以内

怎么才能更快呢?


引用 6 楼 giftsf 的回复:
我改成
SELECT  COUNT(*) 
FROM test_a a JOIN test_b b FORCE INDEX(PRIMARY)
ON a.id=b.id
 这样能10秒以内

怎么才能更快呢?


在你没有强制主键索引之前优化器采用辅助索引是没有错的,那是对b表扫描最快的方式,慢在对a表做链接查询的时候,你可以看下强制索引之后的执行计划,是不是用了Block Nested Loop

这种查询,用了索引才能快,像join的化,关联字段就得有索引,且能用上

^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群:345733473 ^_^