1 MyISAM表count查询
- MyISAM表的总记录数在INFORMATION_SCHEMA.TABLES中
- 在进行不带条件的count查询时不需要进行表的扫描
2 InnoDB表count查询
- InnoDB表的总记录数也在INFORMATION_SCHEMA.TABLES中
- 但是由于InnoDB支持事务,其处于不同状态的连接读的行数是不一样的
- 所以在进行count查询时还是需要进行表扫描进行计数
- count(1) 查询
- 选择表中最小索引扫描查询
- 为什么选择最小索引?因为索引小则单个数据能容纳的数据条数就多,需要扫描的总数据页就变小了
- count(*) 查询,与count(1)一致
- count(字段)查询,当字段值为null时将不统计
- count(主键字段)查询时,与count(1)一致
- count(非主键索引字段)查询时,走当前索引树查询
- count(非索引字段)查询时,全表扫描查询
由上可知count查询的性能依次为:
count(1) = count(*) = count(主键) >= count(非主键索引) > count(非索引字段)
3 count查询优化
MyISAM表直接查询无需优化
InnoDB对于总行树精确度要求不高的话可以采取以下优化手段
- 查询INFORMATION_SCHEMA.TABLES中统计信息
- 执行show table status 查看
- 将总记录数维护到redis中
- 增加数据计数表