InnoDB——Cardinality值

什么是Cardinality

Cardinality表示索引中不重复记录数量的预估值

哪些列该添加索引(高选择性)

并不是所有的查询条件中出现的列都需要添加索引。

对于什么时候添加B+树索引,一般的经验是,在(结果数据是)访问表中很少一部分时使用B+树索引才有意义。
对于性别字段、地区字段、类型字段,它们可取值的范围很小,称为低选择性。如:

SELECT * FROM student WHERE sex = 'M'

按性别进行查询时,可取值的范围一般只有’M’、‘F’。
因此上述SQL得到的结果可能是该表的50%的数据(假设男女比1:1),即低选择性,这时添加B+树索引是完全没有必要的。

相反,如果某个字段的取值范围很广,几乎没有重复,即属于高选择性,则此时使用B+树是合适的。例如,姓名字段,基本上在一个应用中不允许重名出现。

如何查看是否有高选择性(查看Cardinality值)

可以通过SHOW INDEX结果中的列Cardinality来观察。

Cardinality表示索引中不重复记录数量的预估值。同时需要注意,Cardinality是一个预估值,而不是一个准确值。
在实际应用中,Cardinality/n_rows_in_table应尽可能地接近1
如果非常小,那么用户需要考虑是否还有必要创建这个索引。
故在访问高选择性属性的字段并从表中取出很少一部分数据时,对这个字段添加B+树索引是非常有必要的。

Cardinality的更新策略和计算原理

建立索引的前提是列中的数据是高选择性的,这对数据库来说才具有实际意义。
然而数据库是怎样来统计Cardinality信息的呢?Cardinality的统计是在存储引擎层进行的。

此外需要考虑的是,在生产环境中,索引的更新操作可能是非常频繁的。
如果每次索引在发生操作时就对其进行Cardinality的统计,那么将会给数据库带来很大的负担。
另外需要考虑的是,如果一张表的数据很大,如一张表有50G的数据,那么统计一次Cardinalidy信息所需要的时间可能非常长。这在生产环境下也是不能接受的。因此,数据库对于Cardinality的统计都是通过采样(Sample)的方法来完成的。

InnoDB中Cardinality的更新策略

在InnoDB存储引擎中,Cardinality统计信息的更新发生在两个操作中:INSERT和UPDATE。
根据前面的叙述,不可能在每次发生INSERT和UPDATE时就去更新Cardinality信息,这样会增加数据库系统的负荷。同时对于大表的统计,时间上也不允许数据库这样去操作。

因此,InnoDB存储引擎内部对更新Cardinality信息的策略为:

  • 表中1/16的数据已发生过变化
  • stat_modified_counter>2000 000 000

第一种策略为自从上次统计Cardinality信息后,表中1/16的数据已经发生过变化,这时需要更新Cardinality信息。

第二种情况考虑的是,如果对表中某一行数据频繁地进行更新操作,这时表中的数据实际并没有增加,实际发生变化的还是这一行数据,则第一种更新策略就无法适用这种情况。

故在InnoDB存储引擎内部有一个计数器stat_modified_counter,用来表示发生变化的次数,当stat_modified_counter大于2000 000 000时,则同样需要更新Cardinality信息。

计算原理

InnoDB内部通过采样的方法来进行Cardinality值的统计和更新操作。默认InnoDB对8个叶子节点(Leaf Page)进行采用。采用的过程如下:

  • 取得B+树索引中叶子节点的数量,即为A。
  • 随机取得B+树索引中的8个叶子节点。统计每个页不同记录的个数,记为P1, P2, …, P8。
  • 根据采样信息给出Cardinality的预估值:Cardinality= (P1+P2+…+P8) * A/8。

通过上述的说明可以发现,在InnoDB中,Cardinality值时通过对8个叶子节点预估而得的,不是一个实际精确的值。
再者,每次对Cardinality值的统计,都是通过随机取8个叶子节点得到的,这同时又暗示了另一个Cardinality现象,即每次得到的Cardinality值可能是不同的。

但是有一种情况可能使得用户每次 观察到的索引Cardinality值都是一样的,那就是当表足够小,表的叶子节点小于或者等于8个。这样即使随机采样,也总是会采取到这些页,因此每次得到的Cardinality值是相同的。

一些参数:

  • innodb_stats_sample_pages:设置统计Cardinality时每次采样的数量买,默认是8.
  • innodb_stats_method:如何对待索引中出现的NULL记录,默认是nulls_equal,表示将null值视为相等的记录,类似的还有nulls_unequal, nulls_ignore;

其他触发更新Cardinality的行为

  • ANALYZE TABLE
  • SHOW TABLE STATUS
  • SHOW INDEX
  • 访问INFORMATION——SCHEMA架构下的表TABLES和STATISTICS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/285.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中的反射

类加载器(1)类的加载当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中。说明:a.图中的Class对象是指:java.lang.Class类的…

从Linux内核中学习高级C语言宏技巧

Linux内核可谓是集C语言大成者,从中我们可以学到非常多的技巧,本文来学习一下宏技巧,文章有点长,但耐心看完后C语言level直接飙升。 本文出自:大叔的嵌入式小站,一个简单的嵌入式/单片机学习、交流小站 从Linux内核中学习高级C语言宏技巧 1.用do{}while(0)把宏包起来 …

《网络安全》零基础教程-适合小白科普

《网络安全》零基础教程 目录 目录 《网络安全》零基础教程 第1章 网络安全基础 什么是网络安全 常见的网络安全威胁 网络安全的三个基本要素 网络安全的保障措施 第2章 网络攻击类型 病毒、蠕虫、木马、后门 DoS、DDoS攻击 ​​​​​​​SQL注入、XSS攻击 ​​​…

测试背锅侠?入职软件测试后大d佬给我丢了这个bug分类分析,至今受益匪浅......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 刚成为入职&#xf…

测试场景设计

测试场景设计 又叫做场景法。其实对于场景法是测试用例中面临最多的,但是这种模式不是很容易总结,有时候是基于经验,有时候是我们对系统的了解。所以在这种情况下,我们强硬的用场景法对其进行规范。 场景法原理 现在的软件几乎…

vscode无法连接宝塔ftp排雷

宝塔面板现在使用率非常的高。今天把自己的踩坑处理方法记录一下。 在配置号宝塔面板ftp后,使用vscode的sftp插件,发现一直链接不上。一度以为自己配置文件,配置的参数有问题。各种度娘后,花了好长时间。后来发现自己陷入了误区。…

JS高级知识总结

文章目录1. this指向问题2. 对象进阶2.1 对象的定义和使用2.2 对象访问器2.2.1 Getter2.2.2 Setter2.3 对象构造器2.4 对象原型2.4.1 prototype属性2.4.2 \_\_proto\_\_ 属性2.4.3 constructor属性2.4.4 原型链2.5 Object对象2.5.1 管理对象2.5.2 保护对象3. 函数进阶3.1 函数的…

【Python】控制自己的手机拍照,并自动发送到邮箱

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 今天这个案例,就是控制自己的摄像头拍照, 并且把拍下来的照片,通过邮件发到自己的邮箱里。 想完成今天的这个案例,只要记住一个重点:你需要一个摄像头 思路…

8大主流编程语言的适用领域,你可能选错了语言

很多人学编程经常是脑子一热然后就去网上一搜资源就开始学习了,但学到了后面发现目前所学的东西并不是自己最喜欢的,好像自己更喜欢另一个技术,感觉自己学错了,于是乎又去学习别的东西。 结果竹篮打水一场空,前面所付…

蓝桥杯刷题冲刺 | 倒计时28天

作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.卡片2.数字三角形3.购物单4.回文日期1.卡片 题目 链接: 卡片 - 蓝桥云课 (lanqiao…

【计算机组成原理 - 第一章】计算机系统概论(完结)

本章参考王道考研相关课程: 【2021版】1.2.1_计算机硬件的基本组成_哔哩哔哩_bilibili 【2021版】1.2.2_认识各个硬件部件_哔哩哔哩_bilibili 【2021版】1.2.3_计算机系统的层次结构_哔哩哔哩_bilibili 【2021版】1.3_计算机的性能指标_哔哩哔哩_bilibili 目录 一、…

彻底搞懂nodejs事件循环

nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型。这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码。当异步事件触发之后,就会通知主线程,主线程执行相应事件的回调。 以上是众所周知的内容。今天…

14个Python处理Excel的常用操作,非常好用

自从学了Python后就逼迫用Python来处理Excel,所有操作用Python实现。目的是巩固Python,与增强数据处理能力。 这也是我写这篇文章的初衷。废话不说了,直接进入正题。 数据是网上找到的销售数据,长这样: 一、关联公式:…

人工智能轨道交通行业周刊-第35期(2023.2.20-2.26)

本期关键词:重庆智慧轨道、智能运维主机、标准轨距、地方铁路公报、景深、机器视觉应用 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通Rai…

【C/C++】必知必会知识点大总结

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…

基于Reactor模式下的epoll多路复用服务器

文章目录一、认识Reactor模式1.1 Reactor 模式的概念1.2 Reactor 模式的组件1.3 Reactor 模式的流程1.4 Reactor 模式的优点二、Reactor模式下的 epoll ET服务器2.1 总体设计思路2.2 Connection 类结构2.3 封装 socket 实现 Sock 类2.4 封装 epoll 实现 Epoller 类2.4.1 Create…

2023年BeijngCrypt勒索病毒家族最新变种之.halo勒索病毒

目录 前言:简介 一、什么是.halo勒索病毒? 二、.halo勒索病毒是如何传播感染的? 三、感染.halo后缀勒索病毒建议立即做以下几件事情 四、中了.halo后缀的勒索病毒文件怎么恢复? 五、加密数据恢复情况 六、系统安全防护措施建…

宣布推出 .NET 社区工具包 8.1!

我们很高兴地宣布 .NET Community Toolkit 8.1 版正式发布!这个新版本包括呼声很高的新功能、bug 修复和对 MVVM 工具包源代码生成器的大量性能改进,使开发人员在使用它们时的用户体验比以往更好! 就像在我们之前的版本中一样,我…

STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈

STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈📌相关篇《STM32F1基于STM32CubeMX配置硬件SPI驱动nRF24L01数据收发》 🎬功能演示 🌿工程默认配置的是STM32F103VC单片机,其他型号的修改需要修改启动文件startup_st…

python+django+vue图书个性化推荐系统

整个系统是由多个功能模块组合而成的,要将所有的功能模块都一一列举出来,然后进行逐个的功能设计,使得每一个模块都有相对应的功能设计,然后进行系统整体的设计。 本图书个性化推荐系统结构图如图python manage.py runserver 开…
最新文章