查看数据库中表的总记录数
这里提供三种方法,前两种用于数据量比较大的表,查看表的大概总记录数结果(可能不是非常准确)。
总记录数-查看数据库中表的状态
SELECT TABLE_NAME,TABLE_ROWS,table_comment FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='table_name';
总记录数-查看单表的状态
show table status where Name='table_name';
总记录数-count()
COUNT(expr) ,返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。
执行计划
InnoDB引擎&不加where条件的情况下
InnoDB通过遍历最小的可用二级索引来处理SELECT COUNT()语句,除非索引或优化器提示指示优化器使用其他索引。如果二级索引不存在,InnoDB通过扫描聚集索引来处理SELECT COUNT()语句
当只有聚簇索引id时,count (1)&count(*)&count(id) 走聚簇索引,count(其他字段)扫描全表;
当有二级索引时,count (1)&count(*)&count(索引字段) 一般都是走二级索引(优化器会选一个占空间小的索引,聚簇索引包含信息多占空间大),count(其他字段)扫描全表;
MySQL会优先选择最小的非聚簇索引来扫表。优化的前提是查询语句中不包含where条件和group by条件。
MySQL官方文档这么说:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
测试脚本
explain SELECT count(id) from base_category; -- 全表记录数
explain SELECT count(feature) from base_category;
-- 等价于
explain SELECT count(id) from base_category where feature is not null;
所以,
对于count(1)和count(),MySQL的优化是完全一样的,根本不存在谁更快!count (1)比count( )性能好的说法在新版本中不科学了
count(主键字段)不一定走主键索引
count(字段)需要进行字段的非NULL判断,所以效率会低一些。
建议使用count(*),因为这是SQL92定义的标准统计行数的语法。
测试数据库版本5.6.20