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