我有一张包含3000000条记录的表message_message
。
当我进行计数(*)查询时,它非常慢......:
的MySQL> select count(*) from message_message
;
+ ---------- +
| count(*)|
+ ---------- +
| 2819416 |
+ ---------- +
成排1行(2分35.35秒)
解释一下:
MySQL的> explain select count(*) from message_message
;
| id | SELECT_TYPE |表|类型| possible_keys |关键| key_len | ref |行|额外|
| 1 |简单| message_message |指数| NULL |主要| 4 | NULL | 2939870 |使用索引|
1行(0.02秒)
会发生什么?
答案 0 :(得分:5)
在InnoDB中查看This Post,您需要进行全表扫描,而在MyISAM中则需要读取索引。
如果你使用where
子句虽然它改变了执行模式以使用索引,所以一般来说InnoDB在完全不受限制的计数上比MyISAM慢,而性能在限制计数上匹配。
答案 1 :(得分:0)
如果要计算记录数量,最好查询整个表并使用结果集的num_rows属性。如果您想要汇总查询(与Count(...)
结合使用),通常会使用GROUP BY
。