COUNT(*) 怎么这么慢呢?

giftsf 2016-04-16 02:32:30
mysql INNODB
两个表 test_a test_b
id都是自增字段,主键
SELECT COUNT(*)
FROM test_a a JOIN test_b b
ON a.id=b.id

竟然用了25秒
...全文
239 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_28192141 2016-04-19
  • 打赏
  • 举报
回复
引用 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
giftsf 2016-04-19
  • 打赏
  • 举报
回复
我改成 SELECT COUNT(*) FROM test_a a JOIN test_b b FORCE INDEX(PRIMARY) ON a.id=b.id 这样能10秒以内 怎么才能更快呢?
  • 打赏
  • 举报
回复
这种查询,用了索引才能快,像join的化,关联字段就得有索引,且能用上
qq_34648581 2016-04-18
  • 打赏
  • 举报
回复
当你的扫描数据在表中是绝大多数记录的情况下, 这时mysql会 判定走全表扫描比走索引可能更合适
anwll 2016-04-18
  • 打赏
  • 举报
回复
你对索引有点误解,从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几秒
giftsf 2016-04-16
  • 打赏
  • 举报
回复
忘了说了 各插入了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几秒
ACMAIN_CHM 2016-04-16
  • 打赏
  • 举报
回复
以文本方式贴出 explain select ... show index from .. 以供分析。
rick-he 2016-04-16
  • 打赏
  • 举报
回复
数据量多少?执行计划贴下

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧