关键词:索引分布    cardinality


语法:ANALYZE TABLE 表名;

作用:执行ANALYZE TABLE,MySQL会分析指定表的键的值(主键、唯一键、外键等,也可以看成就是索引列的值)分布情况,并会记录分布情况。

限制:执行此语句需要具有SELECT、DELETE权限,且只对存储引擎为InnoDB、MyISAM、NDB的表有作用,不能用于视图。如下图所示,actor_info是视图,执行失败:

执行输出结果:

解释

Table

表名

Op

总是analyze

Msg_type

status, error, info, note, 或者 warning

Msg_text

信息


在对表的键分布进行分析时,ANALYZE TABLE操作会将指定的表从表定义缓存中移除,并且会对于InnoDB、MyISAM表会加上读锁,即其他会话只能对表数据进行查询,无法对表数据进行修改,直到执行分析的会话释放了锁。

默认的,MySQL服务会将 ANALYZE TABLE语句写到binlog中,以便在主从架构中,从服务能够同步数据。(从服务通过binlog与主服务完成数据同步)。可以添加参数取消将语句写到binlog中:

ANALYZE NO_WRITE_TO_BINLOG TABLE 表名 或者 ANALYZE LOCAL TABLE 表名


ANALYZE TABLE分析后的统计结果会反应到cardinality的值,该值统计了表中某一键所在的列,不重复的值的个数。该值越接近表中的总行数,则在表连接查询或者索引查询时,就越优先被优化器选择使用。也就是索引列的cardinality的值与表中数据的总条数差距越大,即使查询的时候使用了该索引作为查询条件,实际存储引擎实际查询的时候使用的概率就越小。我们都知道,索引尽量建立在重复值很少的列上就是基于这个原因。下面通过例子来验证下。cardinality可以通过SHOW INDEX FROM 表名查看:

film表中的数据总条数是1000,由上图可知,film表建立了四个索引,前两个的索引的cardinality就等于表的数据总条数,表示很优秀。下面两个的值才是1,就很差了。查看select * from film where film_id = 1;的执行计划,其中film_id是索引列,cardinality=1000:

从执行计划的结果可以看出,上面的语句是使用了索引的。再来查看select * from film where language_id = 1;的执行计划,其中language_id也是索引列,但是cardinality=1:

由上面执行计划的结果可以看出,虽然语句中使用了索引,但是存储引擎在实际执行查询的时候并没有使用索引。因为cardinality的值与表中的数据总条数差距太大了。

MySQL之ANALYZE TABLE相关推荐

  1. mysql优化Analyze Table

    MySQL 的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为"散列程度"),它表示某个索引对应的列包含 ...

  2. MySQL的analyze table和optimize table对表进行定期优化

    1.analyze table优化表的统计信息 mysql> show index from t; +-------+------------+---------------------+--- ...

  3. MySQL 中ANALYZE [LOCAL NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

    ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 本语句用于分析和存储表的关键字分布.在分析期间,使用一个读取锁 ...

  4. mysql表analyze,ANALYZE TABLE语句如何帮助维护MySQL表?

    MySQL查询优化器是MySQL服务器的重要组成部分,可为查询设置最佳的问题执行.对于特定查询,查询优化器使用存储的键分布和其他因素来确定执行联接时应联接表的顺序以及特定表应使用哪个索引. 但是,键分 ...

  5. MySQL check table/optimize table/analyze table/REPAIR TABLE

    check table:检查InnoDB和MyIsam是否有错误.检查表或者视图是否存在错误,对 MyISAM 和 InnoDB 存储引擎的表有作用.对于 MyISAM 存储引擎的表进行表检查,也会同 ...

  6. mysql空洞_optimize table 删除空洞--MYSQL

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  7. mysql之 OPTIMIZE TABLE整理碎片

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  8. InnoDB: space header page consists of zero bytes in tablespace ./mysql/iyikcr32.ibd (table mysql/iyi

    今天第一天上班,就遇到了一个非常棘手的问题:InnoDB: space header page consists of zero bytes in tablespace ./mysql/iyikcr3 ...

  9. mysql 的alter table操作

    1.如下的语句,预期是执行后回滚,表里面并不会新增这个字段.实际情况却是新增了.因为alter table带有隐式提交的操作.在回滚前已经提交了. BEGIN; alter table XXX add ...

最新文章

  1. SSH下know_hosts的作用(转)
  2. 【区块链】区块链学习要点记录
  3. 现代通信原理2.3:为什么我们这么关注傅立叶变换?
  4. 2022年 会员管理的五大趋势
  5. win10任务栏无反应假死解决办法
  6. 2022年金属非金属矿山(地下矿山)主要负责人考试题及模拟考试
  7. bgfx入门练习2——找出DX,OpenGL驱动切换实现原理
  8. python对医学图像的基本处理_python OpenCV 实现图片的医学处理
  9. 移动端屏幕适配(750px设计稿)
  10. Word最常用的100个通用快捷键
  11. python调用大漠插件寻路_python怎么调用大漠?
  12. 通过搜索引擎快速寻找漏洞
  13. Windows系统安装之 BIOS篇(AMI BIOS)
  14. C++利用opencv调用pytorch训练好的分类模型
  15. Linux 虚拟网络设备详解之 Bridge 网桥
  16. 关于Win10/11系统上安装Ubuntu双系统的rufus方法及实践问题
  17. i++,i--与++i,--i的区别
  18. 超低频测试信号产生电路软件流程图,新超低频任意信号发生器.pdf
  19. 月报|海伯利安7月项目进展汇报
  20. linux conda删除镜像,conda测试2019镜像问题

热门文章

  1. multimap学习之创建,初始化,赋值操作operator=, empty,size,max_size
  2. HTTP - 长连接 短连接 长轮询 短轮询 心跳机制
  3. 【easyDL】数据集上传后不显示分类,一直提示无效文本
  4. 看到照片中的樱花和富士山
  5. java毕业设计校园美食评价系统mybatis+源码+调试部署+系统+数据库+lw
  6. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xa6 in position 34: illegal multibyte sequence
  7. Office365学习笔记—创建WikiPage
  8. 每天学习写论文Day44 怎样找文献、下载文献?
  9. 10丨Python爬虫:如何自动化下载王祖贤海报?
  10. python金融实战 源代码_穆棱市seo总代直销python金融量化营业实战课程 python量化项目实战源码+课件+视频...