背景
我们经常会使用到一个SQL语句,就是查询某张表的总行数。常常使用的查询命令有几种,比如:select count(*) from t,select count(id) from t(id为主键),select count(1) from t,select count(某普通字段) from t以及show table status的rows字段。然而却不知道用哪种查询方式最合适。接下来简单介绍一下我们在MySQL中查询表的总行数时该用什么命令。
不同存储引擎,查询效率不同
在分析几种查询方式之间的不同之前,我们先来看下以select count(*) from t为例,不同存储引擎之间查询行数方式的不同。常见的存储引擎有MyISAM和InnoDB。
InnoDB:每次我们需要查询某张表的总行数时,都会遍历整张表计算出结果。
MyISAM:每张表的总行数会记录在磁盘中存储,在我们需要查询某张表的总行数时,命令会直接取出对应字段信息。(不过需要注意,当命令查询的不是表总行数,而是where查询某些行时,也依然需要像InnoDB一样遍历整张表计算出结果)
很显然,在表行数较多时,MyISAM的方式是要比InnoDB更快的。
那么,为什么InnoDB不采用与MyISAM相同的处理方式呢?
本质原因在于InnoDB支持事务,我们可以看个具体的例子就明白了。