Mysql count(*)的使用原理以及InnoDb的优化策略

news/2024/11/5 12:22:32/

Mysql count的原理你真的了解吗?

    • 1、数据库引擎的区别
    • 2、InnoDB中count的使用
    • 3、innodb对select(\*)的优化/为什么select(\*)通过非聚集索引效率要高于聚集索引

面试问到说“你觉得count(*) 的效率怎么样?”,一般回复innodb对count(*)进行优化后效率显著提升,所以count(*)效率是最高的,但是面试官可能觉得你掌握情况一般

1、数据库引擎的区别

MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高; 但是如果是带条件的count,MyISAM也慢。

InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

2、InnoDB中count的使用

count的查询效率如下 count(普通字段) < count(主键) < count(*) ≈ count(1)

使用count的目的就是计算非空行数,如果使用的是普通字段,需要去判断该字段是否不为空,然后再去累计行数,而主键具备非空约束,可直接累计行数;注意,count(字段)都需要去遍历一整张表,然后将其中的字段取出来按行进行累加,

而count(1) 也会去遍历整张表但不会取数据,会放数字进去然后按行进行累加。

count(1)跟count(*)遍历整张表都不需要取字段,减少返回给服务器的操作,直接按行累加,所以它们的速度会比使用字段要快

3、innodb对select(*)的优化/为什么select(*)通过非聚集索引效率要高于聚集索引

count(字段非聚集索引)的索引结构(叶子节点保存的是(部分字段))会比count(主键,聚集索引,叶子节点保存的是row数据),那么count(字段)遍历整张表要快的多;

之所以快,是由于查询所访问的数据只占表的很小部分,如果访问的数据多了,那反而不如通过表扫描来得快,因为扫描用的是顺序IO,效率更高,比运用随机IO访问大量数据的效率高很多(is null 这种二义性查询索引失效的情况),所以通过非聚集索引,提升count(*) 的查询速度的本质在于,非聚集索引所占空间的大小往往,远小于聚集索引或堆表所占用的空间大小;

并且Mysql优化器会主动找到最小的索引数来遍历,保证逻辑正确的前提下,尽量减少扫描的数据量。

但是这个结论也不完全正常,如果非聚集索引的字段很长,或者说是联合索引,那可能效果会适得其反。

以上便是Mysql count(*)的使用原理以及InnoDb的优化策略的全部内容,如果有解读不当欢迎在评论区指出!


http://www.ppmy.cn/news/31780.html

相关文章

Dopamine-PEG-cRGD,DOPA-PEG-cRGD,多巴胺-聚乙二醇-crgd细胞穿膜肽

名称:多巴胺-聚乙二醇-cRGD穿膜肽,多巴胺-聚乙二醇-crgd细胞穿膜肽英文名称:Dopamine-PEG-cRGD,DOPA-PEG-cRGD规格:50mg,100mg,150mg(根据要求可定制&#xff09;描述&#xff1a;cRGD多肽序列: cyclo(RGDfK)外 观 : 半固体或固体&#xff0c;取决于分子量。溶解性&#xff1a;…

超超超超保姆式详解——字符函数和字符串函数(学不会打我)上

目录 长度不受限制的字符串函数 strlen部分 strlen函数的易错小知识 strlen函数的实现 strcpy部分 strcat部分 自己实现strcat strstr函数部分 简单例子&#xff1a; 分析 strcmp部分 长度受限制的字符串函数 strncpy 简单例子 strncat strncmp 简单例子 &…

Android源码分析 - View的触摸事件分发

0. 相关分享 Android源码分析 - InputManagerService与触摸事件 1. 接收Input系统发送来的事件 时序图源&#xff1a;稀土掘金 在注册Window的时候&#xff0c;来到ViewRootImpl&#xff0c;其中不仅发起窗口注册&#xff0c;还开启了输入事件的监听&#xff1a; //ViewRoo…

Oracle 数据库相关主题:用户、权限、常用管理工具、常用命令

1. Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN 四种用户有什么区别&#xff1f; SYS用户&#xff08;超级管理员&#xff09;&#xff1a;sys用户具有“SYSDBA”或者“SYSOPER”权限。当创建一个数据库时&#xff0c;SYS 用户将被默认创建并授予 DBA 角色&#xff0c;所有数据…

HTML 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录前言HTML 结构快速生成代码框架HTML 常见标签注释标签标题标签: h1-h6段落标签&#xff1a;p换行标签&#xff1a;br格式化标签…

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium&#xff1f; 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、什么是Selenium&#xff1f; …

JDBC的API详解

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、DriverManager 驱动管理类 1.注册驱动 2.获取数据库连接 二、Connection 数据库连接对象 1.获取执行对象 2.事务管理 三、Statement 1.执行DDL、DML语句 2.执行DQL语句 四、ResultSet 以JDBC快速…

第十四届蓝桥杯模拟赛(第三期)Python

1 进制转换 问题描述   请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。   请将这个数的十进制形式作为答案提交。 答案&#xff1a;2730 def ch…