**

Hi,大家好!我是白日梦。

今天我要跟你分享的话题是:“大家常说的基数是什么?”

推荐阅读方式

使用推荐阅读,有更好的阅读体验

一、基数是啥?

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复杂性。表的主键中的列数也很重要,因为主键列被附加到每个非唯一索引中。

参考:

推荐阅读

面试官都关注了!你还在犹豫什么呢?

mysql 基数_谈谈MySQL的基数统计相关推荐

  1. mysql怎么删除临时表里的数据_谈谈MySQL数据库中临时表的应用

    MySQL在很多情况下都会用到临时表总结一下什么时候会用到临时表 什么是临时表MySQL用于存储一些中间结果集的表临时表只在当前连接可见当关闭连接时Mysql会自动删除表并释放所有空间. 以下讨论的是 ...

  2. mysql悲观群_谈谈mysql的悲观和乐观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...

  3. 建立唯一索引后mysql策略_【MySQL】MySQL索引背后的之使用策略及优化【转】

    另外很不错的对于索引及索引优化的文章: 索引的使用 示例数据库 为了讨论索引策略,需要一个数据量不算小的数据库作为示例.本文选用MySQL官方文档中提供的示例数据库之一:employees.这个数据库 ...

  4. mysql整备_【mysql】使用xtrabackup在线增量备份及恢复数据库

    一.Percona Xtrabackup 简介 1.Xtrabackup  bin目录文件 介绍 1)innobackupex innobackupex 是xtrabackup的一个符号链接 . in ...

  5. shell实行mysql语句_【Mysql】shell运行mysql的sql语句_MySQL

    bitsCN.com [Mysql]shell运行mysql的sql语句 shell本身是一种脚本语言,所以不能像java一样通过api去连接数据库.shell还是要借助mysql本身的一些运行脚本才 ...

  6. mysql 优化_常用MySQL优化

    1.大批量插入数据优化 (1)对于MyISAM存储引擎的表,可以使用:DISABLE KEYS 和 ENABLE KEYS 用来打开或者关闭 MyISAM 表非唯一索引的更新. ALTER TABLE ...

  7. 阿里云查看mysql版本_查看mysql版本的四种方法及常用命令

    [shengting@login ~]$ mysql -V mysql Ver 14.7 Distrib 4.1.10a, for redhat-linux-gnu (i686) 2:在mysql中: ...

  8. 涂抹mysql 完整_涂抹mysql笔记-管理mysql服务

    $ /mysql/scripts/mysql_install_db --datadir=/mysql/data --basedir=/mysql support-files/mysql.server脚 ...

  9. xshell安装mysql步骤_数据库Mysql与禅道安装

    一.Linux上搭建禅道 Mysql 是关系型数据库管理系统 1.下载安装包:将安装包直接解压到/opt目录下,不要 解压到别的目录在拷贝到/opt/,因为这样会导致文件的所有者和读写权限改变 2.解 ...

最新文章

  1. 【Python学习系列二十八】绘图库pyecharts
  2. 【算法学习笔记】一、算法基础
  3. 风变编程python论文_如何看待风变编程的 Python 网课?
  4. Qt::WindowFlags
  5. Android初学第53天
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (6) - 流水线前端微熔合/宏熔合
  7. VB C# 语法对比图 (代码实例)
  8. html5查看xps文件,c# – 在文档查看器中显示XPS文档
  9. Kafka集群搭建过程(kafka2.5+eagle)
  10. 记录配置Jupyter kernels
  11. 计算机专业的学生注意IT 培训的7 大陷阱
  12. cm-14.1 Android系统定制(二):内置系统应用
  13. Photoshop脚本 锁定图层组所有图层
  14. 简单模式匹配算法——串的模式匹配
  15. 【单片机项目】基于STM32的智能小车设计(一)流程设计
  16. stm32 学习--Stm32F407 SPI1 全双工DMA 收发数据
  17. 微信小程序 - eCharts- x轴换行和旋转45°
  18. houdini 解决opengl 3.3 远程桌面错误
  19. A-Star算法探索和实现(一)
  20. 什么软件可以文字转语音?快把这些软件收好

热门文章

  1. 计算机教师格言座右铭,适合教师的格言座右铭
  2. C语言优先级 短进程 调度算法对于分号和小数点作为间隔符的实现
  3. Word控件Spire.Doc 【页面背景】教程(7) ;在 C# 中为 word 文档设置图像背景
  4. 微信小程序开发:微信小程序生命周期总结
  5. JavaScript 学习笔记day01
  6. springboot毕设项目茶饮店会员信息管理系统eskte(java+VUE+Mybatis+Maven+Mysql)
  7. 论文记载: Deep Reinforcement Learning for Traffic LightControl in Vehicular Networks
  8. 截取string的几种方式
  9. python图形化编辑word_python 将excel获取的图表直接写入WORD,修改为上下型环绕
  10. 风雨飘摇二十年,MMO游戏还有春天吗?