分析[no_write_to_binlog | local]表tbl_name(,tbl_name)……分析[no_write_to_binlog | local]表tbl_name更新直方图col_name(,col_name)……(与N[no_write_to_binlog | local]表tbl_name下落直方图col_name(,col_name)……
分析表
生成表统计信息:
分析表
没有柱状图
子句执行键分布分析,并存储指定表的分布。为MyISAM
表,分析表
对于密钥分布的分析等效于使用myisamchk——分析.分析表
与更新直方图
子句生成已命名表列的直方图统计信息,并将它们存储在数据字典中。此语法只允许使用一个表名。分析表
与把直方图
子句从数据字典中删除指定表列的直方图统计信息。此语法只允许使用一个表名。
分析表
适用于InnoDB
,NDB
,MyISAM
表。它不适用于视图。
如果innodb_read_only
系统变量已启用,分析表
可能会失败,因为它无法更新统计表中的数据字典,使用哪个InnoDB
.为分析表
更新键分布的操作,即使该操作更新了表本身,也可能发生失败(例如,如果它是一个MyISAM
表)。若要获取更新的分布统计信息,请设置information_schema_stats_expiry = 0
.
分析表
支持分区表,您可以使用修改表…分析分区
分析一个或多个分区;有关更多信息,请参见第13.1.9节“ALTER TABLE语句”,第24.3.4节,“分区的维护”.
在分析过程中,表被一个读锁锁定InnoDB
而且MyISAM
.
分析表
从表定义缓存中移除需要flush锁的表。如果有长时间运行的语句或事务仍在使用该表,则后续语句和事务必须等待这些操作完成后才能释放flush锁。因为分析表
本身通常很快完成,涉及同一表的延迟事务或语句可能不明显是由于剩余的flush锁造成的。
缺省情况下,服务器写操作分析表
语句复制到二进制日志,以便它们复制到副本。要抑制日志记录,请指定可选选项NO_WRITE_TO_BINLOG
关键字或其别名当地的
.
分析表
没有柱状图
子句执行一个或多个表的键分布分析并存储分布。任何现有的直方图统计数据不受影响。
如果表在上次键分布分析之后没有更改,则不会再次分析该表。
MySQL使用存储的键分布来决定表的连接顺序。此外,在决定对查询中的特定表使用哪些索引时,可以使用键分布。
要检查存储的密钥分布基数,请使用显示指数
声明或INFORMATION_SCHEMA
统计数据
表格看到第13.7.7.22节“SHOW INDEX语句”,章节26.3.34,“INFORMATION_SCHEMA统计表”.
为InnoDB
表,分析表
通过在每个索引树上执行随机潜水并相应地更新索引基数估计来确定索引基数。因为这些只是估计,重复运行分析表
可以得到不同的数字。这使得分析表
快速上InnoDB
表,但不是100%准确,因为它没有考虑到所有行。
你可以做统计数据收集的分析表
通过启用更精确和更稳定innodb_stats_persistent
,详见第15.8.10.1节,“配置持久优化器统计参数”.当innodb_stats_persistent
是否启用,重要的是运行分析表
在对索引列数据进行重大更改之后,因为统计信息不会定期重新计算(例如在服务器重新启动之后)。
如果innodb_stats_persistent
启用时,您可以通过修改innodb_stats_persistent_sample_pages
系统变量。如果innodb_stats_persistent
禁用时,修改innodb_stats_transient_sample_pages
代替。
有关密钥分布分析的详细信息,请参见InnoDB
,请参阅第15.8.10.1节,“配置持久优化器统计参数”,15.8.10.3节,估算InnoDB表的ANALYZE TABLE复杂度.
MySQL在连接优化中使用索引基数估计。如果连接没有以正确的方式优化,请尝试运行分析表
.在少数情况下分析表
不能为您的特定表产生足够好的值,您可以使用力指数
与您的查询强制使用特定索引,或设置max_seeks_for_key
系统变量,以确保MySQL更喜欢索引查找而不是表扫描。看到B.3.5节“优化器相关问题”.
分析表
与柱状图
子句支持管理表列值的直方图统计信息。有关直方图统计信息,请参见第8.9.6节,“优化器统计信息”.
这些直方图操作是可用的:
存储的直方图管理语句只影响已命名的列。考虑一下这些陈述:
分析c1, c2, c3上10个bucket的更新直方图分析表c1, c3上10个桶的更新直方图分析c2上的表t下跌直方图;
第一个语句更新列的直方图c1
,c2
,c3
,替换这些列的任何现有直方图。第二个语句更新的直方图c1
而且c3
,离开c2
直方图不受影响。第三个语句删除了的直方图c2
,把那些留给c1
而且c3
不受影响。
不支持对加密表生成直方图(以避免在统计数据中暴露数据)或临时
表。
直方图生成适用于所有数据类型的列,除了几何类型(空间数据)和JSON
.
可以为存储列和虚拟生成列生成直方图。
不能为单列唯一索引覆盖的列生成直方图。
直方图管理语句试图尽可能多地执行所请求的操作,并报告剩余的诊断消息。例如,如果一个更新直方图
语句命名多个列,但其中一些列不存在或具有不支持的数据类型,为其他列生成直方图,并为无效列生成消息。
直方图受以下DDL语句影响:
删除表
删除所删除表中列的直方图。删除数据库
删除已删除数据库中任何表的直方图,因为语句将删除数据库中的所有表。重命名表
不移除直方图。相反,它重命名了与新表名相关联的重命名表的直方图。ALTER TABLE
删除或修改列的语句将删除该列的直方图。修改表…转换为字符集
删除字符列的直方图,因为它们受到字符集更改的影响。非字符列的直方图不受影响。
的histogram_generation_max_mem_size
系统变量控制可用于生成直方图的最大内存量。全局值和会话值可以在运行时设置。
改变全球histogram_generation_max_mem_size
Value需要足够的权限来设置全局系统变量。更改会话histogram_generation_max_mem_size
Value需要足够的特权来设置受限制的会话系统变量。看到第5.1.9.1节,“系统变量特权”.
如果为生成直方图而要读入内存的估计数据量超过所定义的限制histogram_generation_max_mem_size
, MySQL对数据进行采样,而不是将所有数据读入内存。采样均匀分布在整个表中。MySQL使用系统
抽样,这是一种页面级抽样方法。
的采样率
的价值柱状图
列的INFORMATION_SCHEMA。COLUMN_STATISTICS
表可以查询,以确定用于创建直方图的采样数据的百分比。的采样率
是介于0.0和1.0之间的数字。值为1表示读取了所有数据(没有采样)。
下面的示例演示抽样。确保数据量超过histogram_generation_max_mem_size
类的直方图统计信息生成之前,将限制设置为一个较低的值(2000000字节)birth_date
的列员工
表格
SET histogram_generation_max_mem_size = 2000000;mysql>使用员工;mysql> ANALYZE TABLE employees UPDATE HISTOGRAM ON birth_date WITH 16 BUCKETS\G ***************************行***************************表:员工。员工人事处: histogram Msg_type: status Msg_text: Histogram statistics created for column 'birth_date'. mysql> SELECT HISTOGRAM->>'$."sampling-rate"' FROM INFORMATION_SCHEMA.COLUMN_STATISTICS WHERE TABLE_NAME = "employees" AND COLUMN_NAME = "birth_date"; +---------------------------------+ | HISTOGRAM->>'$."sampling-rate"' | +---------------------------------+ | 0.0491431208869665 | +---------------------------------+
一个采样率
值0.0491431208869665表示大约4.9%的数据来自birth_date
列被读入内存以生成直方图统计信息。
从MySQL 8.0.19开始,InnoDB
存储引擎为存储的数据提供了自己的采样实现InnoDB
表。当存储引擎不提供自己的存储引擎时,MySQL使用的默认采样实现需要全表扫描,这对于大表来说成本很高。的InnoDB
采样实现通过避免全表扫描来提高采样性能。
的sampled_pages_read
而且sampled_pages_skipped
INNODB_METRICS
计数器可用于监测采样InnoDB
数据页。(一般INNODB_METRICS
计数器使用信息,参见章节26.4.23,“INFORMATION_SCHEMA INNODB_METRICS表”.)
下面的示例演示了采样计数器的使用,这需要在生成直方图统计信息之前启用计数器。
mysql> SET GLOBAL innodb_monitor_enable = '采样%';mysql>使用员工;mysql> ANALYZE TABLE employees UPDATE HISTOGRAM ON birth_date WITH 16 BUCKETS\G ***************************行***************************表:员工。员工人事处: histogram Msg_type: status Msg_text: Histogram statistics created for column 'birth_date'. mysql> USE INFORMATION_SCHEMA; mysql> SELECT NAME, COUNT FROM INNODB_METRICS WHERE NAME LIKE 'sampled%'\G *************************** 1. row *************************** NAME: sampled_pages_read COUNT: 43 *************************** 2. row *************************** NAME: sampled_pages_skipped COUNT: 843
这个公式是基于抽样计数器数据的抽样率近似值:
采样率= sampled_page_read/(sampled_pages_read + sampled_pages_skip)
基于抽样计数器数据的抽样率大致与采样率
的价值柱状图
列的INFORMATION_SCHEMA。COLUMN_STATISTICS
表格
有关为生成直方图而执行的内存分配的信息,请监视性能模式内存/ sql /直方图
乐器。看到第27.12.20.10节,“内存汇总表”.
分析表
对象中的表统计信息INFORMATION_SCHEMA。INNODB_TABLESTATS
表,并设置STATS_INITIALIZED
列未初始化
.在下次访问表时再次收集统计信息。