我有一个包含大约1亿行的表,包含三列(所有INT):
id | c_id | l_id
即使我使用索引甚至基本
select count(*), c_id
from table
group by c_id;
需要16秒(MYISAM)到25秒(InnoDB)才能完成。
有没有办法加速这个过程而不跟踪单独表中的计数(例如通过使用触发器)?
/ edit:所有列都有索引
答案 0 :(得分:1)
不是Count(*)
会产生性能问题,而是分组在1亿行上。
您应该在c_id列上添加索引
答案 1 :(得分:1)
请参阅执行计划,了解执行相同查询的可能方法SqlFiddle,
如果{i}未在我提供的测试集上编入索引, SELECT COUNT(id)
会更快。
否则您应该使用c_id
,因为索引的优化可能不会在查询中使用。
它还取决于数据库中的行数和引擎类型,因为mysql也会根据这个事实决定什么更好。
在执行之前,您应该始终查看查询的执行计划,方法是在选择之前键入COUNT(*)
。
我不得不说,在大多数情况下,大数据集EXPLAIN
和COUNT(*)
应该会产生相同的执行计划。