对于大表,使用GROUP BY的SELECT COUNT(*)为慢

时间:2013-02-12 11:16:37

标签: mysql

我有一个包含大约1亿行的表,包含三列(所有INT):

id | c_id | l_id

即使我使用索引甚至基本

select count(*), c_id 
from   table 
group by c_id;

需要16秒(MYISAM)到25秒(InnoDB)才能完成。

有没有办法加速这个过程而不跟踪单独表中的计数(例如通过使用触发器)?

/ edit:所有列都有索引

2 个答案:

答案 0 :(得分:1)

不是Count(*)会产生性能问题,而是分组在1亿行上。

您应该在c_id列上添加索引

答案 1 :(得分:1)

请参阅执行计划,了解执行相同查询的可能方法SqlFiddle

如果{i}未在我提供的测试集上编入索引,

SELECT COUNT(id)会更快。

否则您应该使用c_id,因为索引的优化可能不会在查询中使用。

它还取决于数据库中的行数和引擎类型,因为mysql也会根据这个事实决定什么更好。

在执行之前,您应该始终查看查询的执行计划,方法是在选择之前键入COUNT(*)

我不得不说,在大多数情况下,大数据集EXPLAINCOUNT(*)应该会产生相同的执行计划。