10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.6 mb
PDF (A4)- 41.7 mb
手册页(TGZ)- 262.2 kb
手册页(邮政编码)- 372.2 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

8.9.6优化器统计数据

column_statistics数据字典表存储关于列值的直方图统计信息,供优化器在构造查询执行计划时使用。若要执行直方图管理,请使用分析表声明。

column_statistics表有以下特点:

  • 该表包含除几何类型(空间数据)和之外的所有数据类型的列的统计信息JSON

  • 该表是持久的,因此不必在每次服务器启动时都创建列统计信息。

  • 服务器对表执行更新;用户不。

column_statistics表不能被用户直接访问,因为它是数据字典的一部分。直方图信息可用INFORMATION_SCHEMA。COLUMN_STATISTICS,它被实现为数据字典表上的一个视图。COLUMN_STATISTICS这些列:

  • SCHEMA_NAMETABLE_NAMECOLUMN_NAME:应用统计信息的模式、表和列的名称。

  • 柱状图:一个JSON值,该值描述列统计信息,存储为直方图。

列直方图包含存储在列中的值范围的部分桶。直方图是JSON对象,以允许列统计信息的表示具有灵活性。下面是一个直方图对象示例:

{"buckets": [[1, 0.333333333333333333], [2, 0.6666666666666666666666], [3,1]], "null-values": 0, "last-updated": "2017-03-24 13:32:40.000000", "sampling-rate": 1, "histogram-type": "singleton", "number-of-buckets-specified": 128, "data-type": "int", "collation-id": 8}

直方图对象有以下键:

  • :直方图桶。桶结构取决于直方图类型。

    单例直方图,桶包含两个值:

    • 取值1:桶的值。类型取决于列数据类型。

    • 值2:双精度表示该值的累积频率。例如,.25和.75表示列中25%和75%的值小于或等于桶值。

    等高直方图,桶包含四个值:

    • 值1、2:桶的上下包含值。类型取决于列数据类型。

    • 值3:双精度表示该值的累积频率。例如,.25和.75表示列中25%和75%的值小于或等于桶的上限值。

    • 值4:桶从低值到高值范围内不同值的个数。

  • 空值: 0.0到1.0之间的数字,表示列值中SQL的比例值。如果为0,列中包含no值。

  • 最后更新的:在生成直方图时,作为UTC值YYYY-MM-DD hh: mm: ss.uuuuuu格式。

  • 采样率: 0.0到1.0之间的数字,表示为创建直方图而采样的数据的比例。值为1表示读取了所有数据(没有采样)。

  • histogram-type:直方图类型:

    • 单例:一个桶表示列中的单个值。类中指定的桶的数量时,此直方图类型将被创建分析表生成直方图的语句。

    • 等高:一个桶表示一个值的范围。类中指定的桶的数量时,此直方图类型将被创建分析表生成直方图的语句。

  • number-of-buckets-specified:文件中指定的桶数分析表生成直方图的语句。

  • 数据类型:该直方图包含的数据类型。当将直方图从持久存储读取和解析到内存时,需要这样做。取值为int使用uint(无符号整数),小数datetime,或字符串(包括字符和二进制字符串)。

  • collation-id:直方图数据的排序ID。它是最有意义的时候数据类型值是字符串.值对应ID中的列值INFORMATION_SCHEMA。整理表格

要从直方图对象中提取特定值,可以使用JSON操作。例如:

mysql> SELECT TABLE_NAME, COLUMN_NAME, HISTOGRAM->>'$。"data-type"' AS 'data-type', JSON_LENGTH(直方图->>'$."buckets"') AS 'bucket-count' FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;+-----------------+-------------+-----------+--------------+ | TABLE_NAME | COLUMN_NAME |数据类型| bucket-count  | +-----------------+-------------+-----------+--------------+ | 国家人口int | | | 226 | | |城市人口int | | 1024 | | countrylanguage | 457 | |语言字符串  | +-----------------+-------------+-----------+--------------+

优化器对收集统计信息的任何数据类型的列使用直方图统计信息(如果适用的话)。优化器应用直方图统计信息,根据列值与常量值比较的选择性(过滤效果)确定行估计值。这些形式的谓词符合直方图的使用条件:

col_name常数col_name<>常数col_name! =常数col_name>常数col_name<常数col_name> =常数col_name< =常数col_name为空col_name不是零col_name之间的常数常数col_name之间的不常数常数col_name在(常数[,常数]…)col_name不是在(常数[,常数]…)

例如,这些语句包含符合直方图使用条件的谓词:

查询金额在100.0到300.0之间的订单SELECT * FROM tbl WHERE col1 = 15 AND col2 > 100;

与常量值进行比较的要求包括常量函数,例如ABS ()而且地板()

SELECT * FROM tbl WHERE col1 < ABS(-34);

直方图统计信息主要用于非索引列。向适用直方图统计信息的列添加索引也可以帮助优化器进行行估计。权衡:

  • 修改表数据时必须更新索引。

  • 直方图只根据需要创建或更新,因此在修改表数据时不会增加任何开销。另一方面,当表发生修改时,统计信息会逐渐过时,直到下一次更新为止。

与从直方图统计信息获得的行估计相比,优化器更喜欢范围优化器的行估计。如果优化器确定应用了范围优化器,则不使用直方图统计信息。

对于被索引的列,可以使用索引潜水来获得行估计值以进行相等比较(参见第8.2.1.2节“航程优化”).在这种情况下,直方图统计不一定有用,因为索引跳水可以产生更好的估计。

在某些情况下,使用直方图统计信息可能无法改善查询执行(例如,如果统计信息过期)。要检查情况是否如此,请使用分析表要重新生成直方图统计信息,请再次运行查询。

或者,禁用直方图统计,使用分析表放弃他们。禁用直方图统计信息的另一种方法是关闭condition_fanout_filter国旗的optimizer_switch系统变量(尽管这也可能禁用其他优化):

设置optimizer_switch = ' condition_fanout_filter = off”;

如果使用直方图统计,结果效果是可见的使用解释.考虑以下查询,其中列没有可用的索引col1

SELECT * FROM t1 WHERE col1 < 24

如果直方图统计显示57%的行t1满足col1 < 24谓词中,即使在没有索引的情况下也可以进行过滤解释显示57.00过滤后的列。