10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 41.1 mb
PDF (A4)- 41.2 mb
PDF (RPM)- 39.8 mb
HTML下载(TGZ)- 9.5 mb
HTML下载(Zip)- 9.6 mb
HTML下载(RPM)- 8.1 mb
手册页(TGZ)- 260.6 kb
手册页(Zip)- 371.7 kb
信息(Gzip)- 3.9 mb
信息(邮政编码)- 3.9 mb
本手册节选

13.7.3.1 ANALYZE TABLE语句

分析[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——分析

  • 分析表更新直方图子句生成已命名表列的直方图统计信息,并将它们存储在数据字典中。此语法只允许使用一个表名。

  • 分析表把直方图子句从数据字典中删除指定表列的直方图统计信息。此语法只允许使用一个表名。

这个陈述要求选择而且插入表的特权。

分析表适用于InnoDBNDB,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关键字或其别名当地的

分析表输出

分析表返回包含下表所示列的结果集。

价值
表格 表名
人事处 分析柱状图
Msg_type 状态错误信息请注意,或警告
Msg_text 信息性消息
密钥分布分析

分析表没有柱状图子句执行一个或多个表的键分布分析并存储分布。任何现有的直方图统计数据不受影响。

如果表在上次键分布分析之后没有更改,则不会再次分析该表。

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节,“优化器统计信息”

这些直方图操作是可用的:

  • 分析表与一个更新直方图子句生成已命名表列的直方图统计信息,并将它们存储在数据字典中。此语法只允许使用一个表名。

    可选N子句指定柱状图的桶数。的价值N取值范围为1 ~ 1024之间的整数。如果省略此子句,则桶数为100。

  • 分析表与一个把直方图子句从数据字典中删除指定表列的直方图统计信息。此语法只允许使用一个表名。

存储的直方图管理语句只影响已命名的列。考虑一下这些陈述:

分析c1, c2, c3上10个bucket的更新直方图分析表c1, c3上10个桶的更新直方图分析c2上的表t下跌直方图;

第一个语句更新列的直方图c1c2,c3,替换这些列的任何现有直方图。第二个语句更新的直方图c1而且c3,离开c2直方图不受影响。第三个语句删除了的直方图c2,把那些留给c1而且c3不受影响。

不支持对加密表生成直方图(以避免在统计数据中暴露数据)或临时表。

直方图生成适用于所有数据类型的列,除了几何类型(空间数据)和JSON

可以为存储列和虚拟生成列生成直方图。

不能为单列唯一索引覆盖的列生成直方图。

直方图管理语句试图尽可能多地执行所请求的操作,并报告剩余的诊断消息。例如,如果一个更新直方图语句命名多个列,但其中一些列不存在或具有不支持的数据类型,为其他列生成直方图,并为无效列生成消息。

直方图受以下DDL语句影响:

  • 删除表删除所删除表中列的直方图。

  • 删除数据库删除已删除数据库中任何表的直方图,因为语句将删除数据库中的所有表。

  • 重命名表不移除直方图。相反,它重命名了与新表名相关联的重命名表的直方图。

  • ALTER TABLE删除或修改列的语句将删除该列的直方图。

  • 修改表…转换为字符集删除字符列的直方图,因为它们受到字符集更改的影响。非字符列的直方图不受影响。

histogram_generation_max_mem_size系统变量控制可用于生成直方图的最大内存量。全局值和会话值可以在运行时设置。

改变全球histogram_generation_max_mem_sizeValue需要足够的权限来设置全局系统变量。更改会话histogram_generation_max_mem_sizeValue需要足够的特权来设置受限制的会话系统变量。看到第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_skippedINNODB_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未初始化.在下次访问表时再次收集统计信息。