为研发同学定制的MySQL面试指南 - “能谈谈基数统计吗?”
**
Hi,大家好!我是白日梦。
今天我要跟你分享的话题是:“大家常说的基数是什么?”
推荐阅读原文链接
https://mp.weixin.qq.com/s/FgxwAFQbEjv5i-TxjvLK6Q
欢迎大家关注一下,刚开始写,持续更新中~
可加我微信 17861405320,欢迎拉你进大佬群
一、基数是啥?
Cardinality指的就是MySQL表中某一列的不同值的数量。
如果这一类是唯一索引,那基数 = 行数。
如果这一列是sex,枚举类型只有男女,那它是基数就是2
Cardinality越高,列就越有成为索引的价值。MySQL执行计划也会基于Cardinality选择索引。
通过下面的方式可以看到表中各列的基数。
比如这个经典的例子:
有一列为sex,那对于sex列中存储的值来说 非男即女,它的基数最大就是2。
那也就完全没有必要为sex建立索引。因为,为了提升你基于sex的查询速度,MySQL会为你选择的这个新索引创建一棵全新的B+Tree。但你sex只有两种值,对于MySQL来说,即使它为你指定的列建立了B+Tree索引,真正执行查询时,最多进行一次二分查询,剩下的操作只能是遍历,所以为sex创建索引意义不大。
二、InnoDB更新基数的时机?
参数:innodb_stats_auto_recalc
控制MySQL是否主动重新计算这些持久性的信息。默认为1表示true,0表示false。
默认情况下当表中的行变化超过10%时,重新计算基数信息。
三、基数是估算出来
基数并不会实时更新!而且它是通过采样估算出来的值!
至于基数的公式是怎样的,可能并不重要。
重要的是你得知道,他是通过随机采样数据页的方式统计出来的一个估算值。
而且随机采样的页数可以通过参数innodb_stats_persistent_sample_pages
设置,默认值是20。
这就意味着 基数值并不准确,甚至你每次计算的结果相擦还是蛮大的。
四、持久化基数
可以通过参数innodb_stats_persistent
控制是否持久化基数,默认为off。
当然你可以为一个单独的表设置 STATS_PERSISTENT=1
那么它的 innodb_stats_persistent
将自动被启用。
开启它的好处是:重启MySQL不会再重复计算这个值,加快重启速度。
四、如何主动更新基数?
执行下面的SQL时都会触发InnoDB更新基数(即使你并没有意识到它会更新基数)。
所以尽量选择一个业务低峰期
analyze table tableName;
如果因为采样的数量太少了,计算的基数错的离谱。那很可能会导致MySQL的优化器选错索引。这是你可以将这个值适当调大。但是增加 太多可能会导致 ANALYZE TABLE
运行缓慢。
反之, ANALYZE TABLE
运行太慢。你可以适度调整参数innodb_stats_persistent_sample_pages
的值。但是这又可能导致基数计算的不准确。
如果没有办法平衡两者的关系。可以考虑减少表中索引列的数量或限制分区的数量以降低 ANALYZE TABLE复杂性。表的主键中的列数也很重要,因为主键列被附加到每个非唯一索引中。
参考:
https://dev.mysql.com/doc/refman/5.7/en/innodb-persistent-stats.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-analyze-table-complexity.html
欢迎关注
**
为研发同学定制的MySQL面试指南 - “能谈谈基数统计吗?”的更多相关文章
- 《为研发同学定制的MySQL面试指南》-- 连载中
Hi大家好,我是来自博客园的赐我白日梦! 为大家带来MySQL面试专题!全文110篇!以问答的方式,由浅入深的帮你应对各类MySQL面试题的狂轰滥炸!当然也不乏会分享一些高阶读写分离数据库中间件原理及 ...
- 推荐一份 Google 面试指南
经常有不少读者在我公众号后台留言,说自己还是应届毕业生,缺乏工作经验与项目经验,不知道如何才能通过面试? 其实,项目经验固然重要,但是企业也知道,对于应届毕业生,是很难有拿得出手的项目经验出来的,毕竟 ...
- MySQL面试 - 读写分离
MySQL面试 - 读写分离 面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 面试官心理分析 ...
- 毕业季offer怎么拿?收下这份非典型求职面试指南
摘要:求职面试莫慌,先自我评估一下 ,华为云专家手把手为你指导. 本文分享自华为云社区<毕业季offer怎么拿?收下这份非典型求职面试指南>,原文作者:技术火炬手 . 又是一年毕业季,对于 ...
- 2014阿里巴巴研发project师暑期实习生面试经验
2014阿里巴巴研发project师暑期实习生面试经验 作者:林子 Blog: http://blog.csdn.net/u013011841 时间:2014年8月 出处:http://blog.c ...
- MySql权威指南
[MySql权威指南] 1.索引(index):原始数据纪录的排序情况. 2.存储过程(store procedure),就是函数. 3.触发器是一组SQL命令,当数据库执行特定操作时触发,如UPDA ...
- Bug是一种财富-------研发同学的错题集、测试同学的遗漏用例集
此文已由作者王晓明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 各位看官,可能看到标题的你一定认为这是一篇涉嫌"炒作"的文章,亦或是为了吸引眼球而起的标 ...
- java架构之路-(面试篇)Mysql面试大全
说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案. 1.索引是什么 ...
- MySQL面试总结
MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键 ...
随机推荐
- matlab中subplot 在平铺位置创建坐标区
来源:https://ww2.mathworks.cn/help/matlab/ref/subplot.html?searchHighlight=subplot&s_tid=doc_srcht ...
- SPI通信基础学习
SPI是"Serial Peripheral Interface"的缩写,即"串行外设接口",是摩托罗拉公司推出的一种串行接口通信协议. 接线的示意图: SPI ...
- Gearman实战第一弹:异步处理结算单
昨天梦回jm,醒来之后看着窗外万里晴空,想大声喊一句:爷青回! 我想起之前使用gearman的岁月.不知不觉也过了快5年,想总结一篇关于gearman的技术文章算是一种对青春的祭奠,再不写的话更少有p ...
- 基于空镜像scratch创建一个新的Docker镜像
我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像.优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包. 比如我机器上docke ...
- MeteoInfoLab脚本示例:数据投影-FLEXPART
FLEXPART是一个类似HYSPLIT的扩散模式,它输出的netcdf文件参照了WRF,可惜全局属性没有写全,比如只有一个投影名称(例如Lambert),没有相关的投影参数:中央经度,标准纬度等等. ...
- 持续集成工具之jenkins+sonarqube做代码扫描
上一篇我们主要聊了下代码质量管理平台sonarqube的安装部署以及它的工作方式做了简单的描述和代码扫描演示:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13 ...
- Spring源码解析之基础应用(三)
组合Java配置 在XML中,我们可以使用<import/>标签,在一个XML文件中引入另一个XML文件,在Java类中,我们同样可以在一个配置类中用@Import引入另一个配置类,被引入 ...
- 单元测试之道Java版——读书笔记
单元测试知道Java版读书笔记 首先我们必须要知道我们所写的代码,它的功能是什么,如果我们不了解代码的行为,那么也就无从测试. 我们测试的目的,是为了我们整个程序架构的稳定,代码其实就是欧文要实现功能 ...
- 【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
问题描述 在默认的URL传递参数中,我们使用的是https://test01.azure-api.cn/echo/resource?param1=sample¶m2=testname这 ...
- VS2010下python3的配置
最近突然又想学python,但用惯了vs2010后,十分希望能在vs2010中编译python的程序,于是,秉承着不作到死就不死心的原则就开始了我的配置之旅.但事实上并不难哦?.... 1.首先上场的 ...