一个表数据量达到百万或更高级别时间你会发现要统计表的总行数会变得越来越慢,这是为什么呢?
这个表的存储引擎有关系,mysql5.7及以上版本默认的存储引擎为innodb,而innodb和myisam引擎有一个重要的区别就是对count()的处理上,myisam会用专门的地方存储表的行数信息,所以在做总行数统计时比较快,而innodb是实时统计行数,每次都是对行数进行一次遍历统计,所以innodb统计行数比较慢。慢的程度大概在1秒到十几秒或者更高,那么如何提高这个统计查询的速度呢?
这里说一个二级索引的方案,等等,大家肯定要说主键索引不是更好吗,为何要用二级索引呢?这就和主键索引也就是聚簇索引的结构有关系,聚簇索引是和数据一起存放的,每个叶子结点占用的空间会大一些,因此如果统计主键索引就会相对慢一些。二二级索引的叶子节点只存放二级索引值和主键索引指针,存储数据少,尤其是二级索引的字段内容很少时,那么统计二级索引的数量就会快很多,因此我们只需要在表中选取一个小字段设为索引(也就是二级索引),那么我们再次执行count(*)时就会发现速度提升明显,这里要注意不需要指定条件,mysql优化器会自动选用二级索引来统计行数的。
网友评论