首页 > 数据库 >MySQL面试题(1):count

MySQL面试题(1):count

时间:2024-01-15 18:55:25浏览次数:32  
标签:count 结点 遍历 面试题 server InnoDB MySQL 主键

InnoDB 和 MyISAM 的 count(*) 有何不同

  • MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数(无where条件)
  • InnoDB 执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数

为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢?

因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”也是不确定的。

InnoDB count(*)、count(主键 id)、count(字段) 和 count(1) 这几个用法的性能差别,为什么

  • count(字段)<count(主键 id)<count(1)≈count(*)
  • count(*) 专门做了优化,不取值。
  • count(1) 不取值。server 层对于返回的每一行,放一个数字“1”进去
  • 对于 count(主键 id) 来说,InnoDB 引擎会把每一行的 id 值都取出来,返回给 server 层。server 层按行累加。
  • 对于 count(字段) 来说,需要先判断字段是否可以为空,再判断值是否为空

count(*) 操作 innoDB 做了哪些优化

B+树只有叶子结点上有数据,全部遍历其实就是对叶子结点的链表进行遍历。此时如果遍历主键索引树,由于其叶子结点上存放的是完整的行信息,对于一个数据页而言其行密度会比较小,最终导致要扫描的数据页较多,进而IO开销也比较大。如果遍历第二索引树,其叶子结点只存放主键信息,其数据页的行密度比较大,最终扫描的数据页较少,节省了IO开销。

标签:count,结点,遍历,面试题,server,InnoDB,MySQL,主键
From: https://www.cnblogs.com/lifan1998/p/17966051

相关文章

  • mysql分区表
    1.什么是分区?​所谓的分区就是将一个表分解成多个区块进行操作和保存,从而降低每次操作的数据,提高性能,而对应用来说是透明的,从逻辑上看就只是一个表(这里跟分库分表的访问不一样),但是物理上的这个表可能是由多个物理分区组成,每个分区都是一个独立的对象,可以进行独立处理。2.分区目......
  • MySQL中SQL语句的执行流程
    比如有一条SQL语句select*fromtableswherename='zhangsan';那么这条语句通过MySQL查询,执行流程是怎么样的?直接看图:1.客户端跟服务端建立连接,权限校验2.检查是否开启缓存QueryCache,并且是否命中缓存,如果命中,直接将数据返回给客户端;没有命中则向后继续执行3.检查SQ......
  • 常用的MySQL备份/还原 的方法
    mysql备份数据库mysql备份单个数据库#mysql备份某个库格式:mysqldump-h主机名-P端口-u用户名-p"密码"--database数据库名>文件名.sql#实例:mysql备份某个库:mysqldump-h10.*.*.9-P3306-uroot-p"密码"--single-transaction--master-data=2--set-gtid-purged=OF......
  • mysql 目录迁移注意事项
    修改vi/etc/my.cnfdatadir=/home/data/mysqlsocket=/home/data/mysql/mysql.socklog-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid 1、权限问题Jobformysqld.servicefailedbecausethecontrolprocessexitedwitherrorcode.See"systemct......
  • 【前端面试】2024年前端面试题之JS篇
    请简述JavaScript中的thisJS中的this是一个相对复杂的概念,不是简单几句能解释清楚的。粗略地讲,函数的调用方式决定了this的值。我阅读了网上很多关于this的文章,ArnavAggrawal写的比较清楚。this取值符合以下规则:在调用函数时使用new关键字,函数内的this是一个全新的对......
  • docker mysql8使用SSL及使用openssl生成自定义证书
    修改my.cnfvi/docker_data/mysql/conf/my.cnf[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]character-set-server=utf8mb4default_authentication_plugin=mysql_native_password#增加sslssl保存,重启mysql容器dockerrestartmysql-8.0.23......
  • kettle从入门到精通 第三十课 mysql 数据连接常用配置
    1、我们平常用的最多的数据库就是mysql了,这里我以mysql为例说下数据库连接池配置。为啥要用连接池,因为数据库建立连接很费性能,所以就建立连接池(提前建立好一批连接)缓存起来提高性能。下图中mysql的设置参数,提前是需要把mysql的jar(如mysql-connector-java-8.0.20.jar)放到kettle文......
  • 软件测试笔试面试题目完全汇总
    软件缺陷:1)软件未实现产品说明书要求的功能2)软件出现了产品说明书指明不应该出现的错误3)软件实现了产品说明书未提到的功能4)软件未实现产品说明书虽未明确提及但应该实现的目标5)软件难以理解、不易使用、运行缓慢或者从测试员的角度看最终用户会认为不好。软件测试:为了发现......
  • 软件测试常考面试题-软件测试面试宝典(一篇足矣)
    软件测试常考面试题-软件测试面试宝典(一篇足矣) 介绍解决锻炼思维问题的思路和方法,从不同角度分析问题,让思维变强大,变宽广的同时在测试方面进行学习和方法的拓展,也会分享读书心得和问题思考。 问:软件测试的原则?答:软件测试的八个原则_山鬼谣弋痕夕的博客-CSDN博客_软件测试......
  • Mysql中设置只允许指定ip能连接访问(可视化工具的方式)
    场景Mysql中怎样设置指定ip远程访问连接:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/115308120前面设置root账户指定ip能连接访问是通过命令行的方式,如果通过可视化工具比如Navicat来实现。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、使用N......