前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何统计表的数据数量

如何统计表的数据数量

作者头像
用户7447819
发布2021-07-23 14:26:40
2.2K0
发布2021-07-23 14:26:40
举报
文章被收录于专栏:面试指北面试指北

如何统计表的数据数量

1. count(*)

在统计一个表行数的时候,我们一般会使用 select count(*) from t。那么count(*) 是如何实现的呢?

1.1 MyISAM

在MyISAM引擎中,会把表的总行数存在磁盘上,需要的时候,直接返回即可。但是如果是加上了where 条件,就会逐行扫描,计算行数。

1.2 InnoDB

在InnnoDB中,需要把数据一行行的读出来,累计计数。

1.3 为什么InnoDB 不跟MyISAM一样把数据存起来?

因为InnoDB支持事务,由于MVCC的存在,对于返回多少行也不是很清楚,只能逐行扫描。

1.4 不同的count 有区别吗?

count() 是一个聚合函数,对于返回的结果集,逐行判断,如果不为null,则累计值加1.

  • count(*), count(1), count(主键id) 返回的都是满足条件的数据总行数。
  • count(主键id),InnoDB会遍历整张表,把id取出来,返回给server层,server拿到id后,判断不为null的时候,就累加1
  • count(1),InnoDB会遍历整张表,不取值。server层对于返回的每一行,放数字1进去,然后判断不为null的,累加1
  • MySQL 针对count(*)做了优化,执行效果较快。
  • count(字段) 返回的是字段不为null的总个数。

1.5 到底该选那个count

推荐使用count(*), 按照效率排序的话是,count(*) 约等于 count(1) > count(主键Id) > count(字段)

2. 用缓存系统计数

对于更新频繁的数据库,可能会考虑使用缓存系统支持。但是缓存系统有可能丢失更新。另一种情况就是,缓存有可能在多个会话并发操作的时候,出现数据不一致的情况。

3. 用数据库计数

将表数量的计数值存放在单独的表中。

3.1 解决了崩溃失效的问题

InnoDB支持崩溃恢复不丢失数据。

3.2 解决了数据不一致问题

在T3时刻,会话A尚未提交,会话B查到的表C的计数器没有加1,而且与查询最近100条记录是对应的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面试指北 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何统计表的数据数量
    • 1. count(*)
      • 1.1 MyISAM
      • 1.2 InnoDB
      • 1.3 为什么InnoDB 不跟MyISAM一样把数据存起来?
      • 1.4 不同的count 有区别吗?
      • 1.5 到底该选那个count
    • 2. 用缓存系统计数
      • 3. 用数据库计数
        • 3.1 解决了崩溃失效的问题
        • 3.2 解决了数据不一致问题
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档