您现在的位置是:主页 > 回头客心水论坛47888 >

COUNT( ) 和 COUNT(1)哪个效率更高?

2021-01-11 04:19      点击次数:

在MySQL InnoDB存储引擎中,COUNT(*)和COUNT(1)都是对的所有结果进行的COUNT。如果有WHERE子句,则是对所有符合筛选条件的数据行进行统计。如果没有WHERE子句,则是对数据表的数据行数进行统计。 因此COUNT(*)和COUNT(1)本质上没有区别,执行的复杂度都是O(N

在MySQL InnoDB存储引擎中,COUNT(*)和COUNT(1)都是对的所有结果进行的COUNT。如果有WHERE子句,则是对所有符合筛选条件的数据行进行统计。如果没有WHERE子句,则是对数据表的数据行数进行统计。

因此COUNT(*)和COUNT(1)本质上没有区别,执行的复杂度都是O(N),也就是采用全表扫描,进行循环+计数的方式进行统计。

如果是MySQL MyISAM存储引擎,统计数据表的行数只需要O(1)复杂度,这是因为每张MyISAM的数据表都有一个meta信息有存储了row_count值。而一致性由表级锁来保证。而InnoDB支持事务,采用行级锁和MVCC机制,所以无法像MyISAM一样,只维护一个row_count变量。因此就需要采用扫描全表,进行循环+计数的方式来完成统计。

需要注意的是,在实际执行中COUNT(*)和COUNT(1)执行时间可能略有差别,不过你还是可以把这两个在执行效率上看成是相等的。

另外在InnoDB引擎中,如果是采用COUNT(*)和COUNT(1)来统计数据行数,要尽量采用二级索引。

因为主键采用的索引是聚簇索引,聚簇索引包含的信息多,明显会大于二级索引(非聚簇索引)。

对于查找具体的行来说,采用主键索引效率更高。而对于COUNT(*)和COUNT(1)这种,不需要查找具体的行,只是统计行数来说,系统会自动采用占用空间更小的二级索引来进行统计。

如果有多个二级索引的时候,会使用key_len小的二级索引进行扫描。当没有二级索引的时候,才会采用主键索引来进行统计。

优化总结:

1、一般情况下:COUNT(*) = COUNT(1) > COUNT(字段)

所以尽量使用COUNT(*),当然如果你要统计的是就是某个字段的非空数据行数,那另当别论。毕竟执行效率比较的前提是要结果一样才行。

2、如果要统计COUNT(*),尽量在数据表上建立二级索引,系统会自动采用key_len小的二级索引进行扫描,这样当我们使用SELECT COUNT(*)的时候效率就会提升,有时候提升几倍甚至更高都是有可能的。

推荐阅读

前途汽车前途K50价格怎么样

0419香港王中王白小姐 , p98吉利平码论坛 ,可选中1个或多个下面的关键词,搜索相关资料。也可直接点搜索资料搜索整个问题。 前途K50,2门2座硬顶纯电动跑车,百公里加速4.6s,2018年8月上市,价位:75.43万(标准型)。整车尺寸:长*宽*高*轴距:4634*2069*

热点新闻

寻找一个支持aspnet的免费空间最好国内的。

可选中1个或多个下面的关键词,搜索相关资料。也可直接点搜索资料搜索整个问题。 260078.com建立健全监管体制机制, , 申请很简单,注册个帐号就能申请到,就是没有MSSQL数据库,只提供免费的MYSQL 展开全部主机屋,非常好用,带asp,php,mysql, 今期管家

Power by DedeCms