关键词:索引分布    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. java从入门到入土_Java从入门到入土100天,第四天
  2. Spring对Hibernate事务管理
  3. assign 可以修饰对象吗
  4. php mysql 分类_php+mysql实现无限分类实例详解
  5. EFLS开源 | 阿里妈妈联邦学习解决方案详解
  6. Python--DBUtil
  7. ArcGIS实验教程——实验七:矢量数据空间校正(Spatial Adjustment)
  8. 每秒处理1000万用户请求…云上架构如何实现高性能和高可用
  9. 关于windows server 2016 更新CVE-2020-1472漏洞补丁的问题
  10. jQuery Validate focusCleanup: true
  11. 【麦课】1~OEL的下载
  12. 免费图床(随时更新)
  13. 雷神领域(并查集真是个好东西)并查集+流氓dp
  14. 佳能c3020维修模式 白电平调整_佳能5d3 如何调色温
  15. 面对中小型机房动力环境该如何实现监控?
  16. win10启动项在什么地方
  17. python中删除list中某指定元素
  18. 混合波束成形| 宽带系统基于码本的信道估计 《Channel Estimation for Hybrid Architecture-Based Wideband Millimete
  19. div布局、table布局、flex布局、多列布局、网格布局 示例
  20. ABB机器人单面直线角焊缝自动排道焊接程序

热门文章

  1. 数据结构(邓俊辉):递归和迭代、分而治之和减而治之(2.例子)
  2. “Microsoft.Jet.OLEDB.4.0” 解决方法
  3. java.lang.IllegalArgumentException: Invalid column index (256). Allowable column range for BIFF8 is
  4. c++求解一个五位数里回文数的个数
  5. 使用Crypto++5.5.2完成RSA加解密,真正的把公钥放在字符串内,而不是放在文件内
  6. unity 光照烘焙效果很虚的问题
  7. 300台服务器系统架构图,01-正文
  8. 26_C# 实现VMS客户端——编码_多线程
  9. 盘点最具影响力的30位网络人
  10. Python 课课练 (八):函数课后练习题