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

如何统计表的数据数量

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

如何统计表的数据数量

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
从JVM层面来解释i++和++i的真正区别
但是这简单的回答并不能入吸引面试官的眼球,如果用java字节码指令分析则效果完全不同。
肉眼品世界
2021/07/13
4110
从JVM层面来解释i++和++i的真正区别
短文:用字节码解析i++和++i的区别
是不是很无聊,相信很多人会回答,i++是先赋值再+1,++i是先+1再赋值。确实是这样,但是我总是想追根溯源,如何解释这个原则?
源码之路
2021/02/02
8370
如何从字节码角度分析Java问题
很简单的两行代码,如果是你遇到这样的问题,你会怎样去把问题解释清楚?是利用Java运算符顺序将式子拆解,然后一步步运算,还是其他什么办法?
叫我阿柒啊
2022/05/09
6010
如何从字节码角度分析Java问题
JVM字节码与Java代码层调优
我们都知道,Java源代码不会像C/C++那样直接被编译为机器码,而是被编译成字节码,这造就了Java可以跨平台的特性。JVM实际执行的也是编译后的字节码,所以想要在Java代码层进行调优,就得对字节码有一定的了解。
端碗吹水
2020/09/23
4710
JVM字节码与Java代码层调优
敖丙字节一面:能聊聊字节码么?
上一篇《你能和我聊聊Class文件么》中,我们对Class文件的各个部分做了简单的介绍,当时留了一个很重要的部分没讲,不是敖丙不想讲啊,而是这一部分实在太重要了,不独立成篇好好zhejinrong 讲讲都对不起詹姆斯·高斯林
敖丙
2022/04/19
3420
敖丙字节一面:能聊聊字节码么?
从字节码层面分析==比较integer和int
可以看出先把两个1存到操作栈中,然后把操作栈中的1存到局部变量表中,最后在比较的时候再把两个1从局部变量表中放到操作数栈中执行if_icmpne逻辑判断来进行比较。其中astore和istore是精髓,astore代表把integer自动拆箱用来存储到局部变量表中。 当数值改为127以上时,唯一改变的字节码指令是iconst->sipush,这是因为: 取值-128~127采用bipush指令, 取值-32768~32767采用sipush指令 取值-2147483648~2147483647采用 ldc 指令。
gzq大数据
2021/09/23
3500
从JAVA字节码到方法运行
很简单的两行代码,如果是你遇到这样的问题,你会怎样去把问题解释清楚?是利用Java运算符顺序将式子拆解,然后一步步运算,还是其他什么办法?在思索一会儿之后,决定还是通过字节码指令来看看这两行代码是怎么运行的。
叫我阿柒啊
2022/05/09
5190
从JAVA字节码到方法运行
jvm之类文件详解(四)
Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何 分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 当遇到需要占用 8 位字节以上空间的数据项时,则会按照高位在前(Big-Endian)的方式分割成若干个 8 位字节进行存储。 Class 文件只有两种数据类型:无符号数和表 链接:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
周杰伦本人
2022/10/25
2080
jvm之类文件详解(四)
一个求水仙花数的类的字节码分析
使用javap得到字节码: javap -verbose com.dhb.geektimestudy.kimmking.week1.Hello
冬天里的懒猫
2021/08/10
2790
异常原理 | 优雅,永不过时
Java 虚拟机里面的异常使用 Throwable 或其子类的实例来表示,抛异常的本质实际上是程序控制权的一种即时的、非局部(Nonlocal)的转换——从异常抛出的地方转换至处理异常的地方。绝大多数的异常的产生都是由于当前线程执行的某个操作所导致的,这种可以称为是同步的异常。与之相对的,异步异常是指在程序的其他任意地方进行的动作而导致的异常。 Java 虚拟机中异常的出现总是由下面三种原因之一导致的:
不惑
2023/12/13
2580
异常原理 | 优雅,永不过时
[JVM] JVM自动内存管理机制(一)
文本主要就JVM结构和字节码文件,进行分析来展开JVM的学习,后续系列文章会从JVM的多个方面的进行知识总结。
架构探险之道
2019/09/09
5350
[JVM] JVM自动内存管理机制(一)
JVM内存与垃圾回收篇第5章虚拟机栈
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
yuanshuai
2022/08/22
4490
JVM内存与垃圾回收篇第5章虚拟机栈
程序员进阶系列:年少不懂爱家家,懂了已是猿中人。
时隔多年,回想起那个面试场景,忍不住要感叹:年少不懂i++(爱家家),如今懂了却已是老码农(双鬓白)。
一猿小讲
2020/09/01
3280
程序员进阶系列:年少不懂爱家家,懂了已是猿中人。
1、引言
栈帧对应一个线程的一个方法的内容,用于方法的执行,包括方法执行过程中的变量的临时状态。同时栈帧也执行动态链接,方法的返回值以及分发异常。栈帧被包含在JVM栈中。每一个栈帧包括:
文彬
2022/06/06
3900
1、引言
JVM学习笔记——类加载和字节码技术篇
在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的类加载和字节码技术部分
秋落雨微凉
2022/11/16
5630
JVM学习笔记——类加载和字节码技术篇
001. JAVA程序运行原理分析
1. 先来看看JVM运行时数据区的结构 线程独占: 每个线程都有它独立的空间,随线程生命周期而创建和销毁。 线程共享: 所有线程能访问这块内存数据,随虚拟机GC 而创建和销毁。 方法区 JVM 用来存
山海散人
2021/03/03
4060
001. JAVA程序运行原理分析
深入理解 JVM 之——字节码指令与执行引擎
对于 C 语言从程序到运行需要经过编译的过程,只有经历了编译后,我们所编写的代码才能够翻译为机器可以直接运行的二进制代码,并且在不同的操作系统下,我们的代码都需要进行一次编译之后才能运行。
浪漫主义狗
2023/09/07
5650
深入理解 JVM 之——字节码指令与执行引擎
初识JVM指令执行流程
摘要: 记录下学习JVM指令执行流程的理解 正文: 初识JVM指令执行流程 /** * 0: aload_0 * 1: invokespecial #1 // Method java/lang/Object."<init>":()V * 4: return * * @author liugang * @since 2018-04-28 */ public class Example1 { /** * 为主方法创建一个frame并将其推入线程
itliusir
2018/05/21
5020
面试官:解释一下Java字节码文件中的JVM指令
Java 之所以流行,一个很重要的原因就是它的跨平台特性,Compile Once, Run Anywhere,编译一次,到处运行。即 Java 源码只需要编译成字节码文件,之后就可以在不同的操作系统(Windows、Mac、Linux)运行,准确讲是运行在操作系统上的 JVM 中。
南风
2019/11/22
7450
字节码文件 Krains 2020-08-04
得到反编译的字节码文件,这些信息都会通过classloader加载到方法区当中,但在运行时方法区中还包含了加载该class文件的classloader信息,当前只是反编译,没有经过classloader。
Krains
2020/08/05
2280
相关推荐
从JVM层面来解释i++和++i的真正区别
更多 >
LV.1
中国石油大学北京硕士
目录
  • 如何统计表的数据数量
    • 1. count(*)
      • 1.1 MyISAM
      • 1.2 InnoDB
      • 1.3 为什么InnoDB 不跟MyISAM一样把数据存起来?
      • 1.4 不同的count 有区别吗?
      • 1.5 到底该选那个count
    • 2. 用缓存系统计数
    • 3. 用数据库计数
      • 3.1 解决了崩溃失效的问题
      • 3.2 解决了数据不一致问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档