Linux学习-MySQL优化之统计数据表行数

在MySQL中统计表的行数,可以使用三种方式 SELECT COUNT(*),SELECT COUNT(1),SELECT COUNT(FIELD),使用三者查询效率如何?
  在MySQL InnoDB引擎中,COUNT(*)和COUNT(1)都是对所有结果进行COUNT,如有WHERE子名,则是对所有符合条件的数据进行统计,如无WHERE子句,则对数据表的数据行进行统计,因此COUNT(*)和COUNT(1)本质上没有区别,时间复杂度都为O(N),即进行全表扫描,进行循环+计数的方式进行统计
  在MySQL MyISAM存储引擎,统计数据表的行数只需要O(1)的复杂度,因为每张MyISAM数据表都有一个meta信息存储了row_count值,而一致性则由表级锁来保证,因为InnoDB支持事务,采用行级绱和MVVC机制,所以无法像MyISAM一样,只维护一个row_count变量,因此采用全表扫描,进行循环+计数的方式来完成统计。
在InnoDB引擎中,如果采用COUNT(*)和COUNT(1)来统计数据行数,要尽量采用二级索引,因为主键采用的索引是聚簇索引,聚簇索引包含的信息多,明显会大于二级索引(非聚簇索引),对于COUNT(*)和COUNT(1)来说,它们不需要查找具体的行,只是统计行数,系统会自动会采用占用空间更小的二级索引来进行统计。
然而如果想要查找具体的行,那么采用主键索引的效率更高,如果有多个二级索引,会使用key_len小的二级索引进行扫描,当没有二级索引的时候,才会采用主键索引来进行统计。
总结
1.一般情况下,三者执行效率为COUNT(*)=COUNT(1)>COUNT(FIELD),我们尽量使用COUNT(*),当然如果你要统计的是某个字段的非空数据行数,则另当别论,毕竟执行效率的前提是结果一样才可以。
2.如果要统计COUNT(*),尽量在数据表上建立二级索引,系统会自动采用key_len小的二级索引进行扫描,这样当我们使用SELECT COUNT(*)的时候效率会提升,有时候可以提升几倍甚至更高。

你可能感兴趣的:(Linux,1024程序员节,mysql,linux)