1

我有一个包含大约 1 亿行的表,由三列(全部为 INT)组成:

id | c_id | l_id

即使我使用索引,即使是基本的

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

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

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

/edit:所有列都有索引

4

2 回答 2

2

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

SELECT COUNT(id)c_id如果没有在我提供的测试集上编入索引,将会更快。

否则您应该使用COUNT(*),因为查询中可能不会使用索引优化。

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

在执行查询之前,您应该始终EXPLAIN通过在选择之前键入来查看查询的执行计划。

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

于 2013-02-12T11:33:49.540 回答
1

这不是导致Count(*)性能问题的原因,而是对 1 亿行进行分组。

您应该在 c_id 列上添加索引

于 2013-02-12T11:19:30.690 回答