MySQL - 复杂性:SELECT COUNT(*)FROM MyTable;

时间:2011-03-10 09:55:53

标签: mysql sql database

这个MySQL查询的复杂性是什么

SELECT COUNT(*) FROM MyTable;

表格中的条目数是否存储在某处并在每次插入或删除行时更新?如果是这种情况,则复杂性应为O(1)。

3 个答案:

答案 0 :(得分:10)

这取决于存储引擎。

  • 对于MyISAM,为每个表存储总行数,因此SELECT COUNT(*) FROM yourtable是操作O(1)。它只需要读取这个值。
  • 对于InnoDB,不存储总行数,因此需要进行完整扫描。这是O(n)操作。

来自manual

  

InnoDB不保留表中的内部行数。 (实际上,由于多版本化,这会有些复杂。)要处理SELECT COUNT(*) FROM t语句,InnoDB必须扫描表的索引,如果索引不完全在,则需要一些时间缓冲池。如果您的表不经常更改,使用MySQL查询缓存是一个很好的解决方案。要快速计数,您必须使用自己创建的计数器表,并让应用程序根据插入和删除更新它。如果近似行数足够,也可以使用SHOW TABLE STATUS。请参见第13.2.13.1节“InnoDB Performance Tuning Tips”。

答案 1 :(得分:1)

MyISAM行数中的AFAIK被缓存,在InnoDB中没有,并且每次计数都会计算所有行。

答案 2 :(得分:-3)

我不确定该值是否存储,但这对您的查询来说并不重要。 将MySQL与您的查询一起使用,它会在您执行它时计算所有返回的行。