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

man*_*h_s 10 mysql sql database

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

SELECT COUNT(*) FROM MyTable;
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 10

这取决于存储引擎.

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

手册:

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