的column_statistics.
数据字典表存储关于列值的直方图统计信息,供优化器在构造查询执行计划时使用。要执行直方图管理,请使用分析表
陈述。
的column_statistics.
表有这些特征:
该表包含除几何类型(空间数据)和外部数据类型之外的列的列的统计信息
JSON
.该表持久化,因此每次服务器启动时都不需要创建列统计信息。
服务器对表执行更新;用户不。
的column_statistics.
表不能被用户直接访问,因为它是数据字典的一部分。直方图信息可用Information_schema.column_statistics.
,其作为数据字典表的视图实现。COLUMN_STATISTICS
有这些列:
schema_name.
,TABLE_NAME
,column_name.
:统计信息适用的架构,表和列的名称。直方图
: 一种JSON
描述列统计信息的值,存储为直方图。
列直方图包含存储在列中值范围的部分桶。直方图是JSON
对象允许列统计信息表示中的灵活性。这是一个示例直方图对象:
{ “桶”:[[1,0.3333333333333333],[2,0.6666666666666666],[3,1]], “空值”:0, “最后更新的”:“2017年3月24日13:32:40.000000“,”采样率“:1,”直方图类型“:”单身“,”桶数 - 指定数“:128,”数据类型“:”int“,”collation-id“:8}
直方图对象具有以下键:
桶
:直方图桶。桶的结构取决于直方图类型。为
单身
直方图,桶包含两个值:“1”表示桶的值。类型取决于列数据类型。
值2:表示该值的累积频率的双精度值。例如,.25和.75表示列中25%和75%的值小于或等于桶值。
为
Equi高度
直方图,桶包含四个值:值1、2:桶的上下两个值。类型取决于列数据类型。
值3:双代表值的累积频率。例如,.25和.75表示列中的25%和75%的值小于或等于桶上值。
值4:从桶较低值的范围内的不同值的数量。
零值
:0.0和1.0之间的数字,表示为SQL的列值的分数空值
价值观。如果为0,则列包含否空值
价值观。最近更新时间
:在生成直方图时,作为UTC值YYYY-MM-DD hh: mm: ss.uuuuuu
格式。采样率
:0.0和1.0之间的数字,表示采样以创建直方图的数据分数。值1表示读取所有数据(无抽样)。直方图类型
:直方图类型:number-of-buckets-specified
:中指定的桶数量分析表
生成直方图的声明。数据类型
:该直方图的数据类型包含。在从持久存储到内存中读取和解析直方图时,需要这一点。该价值是其中之一㈡
,uint.
(无符号整数),双倍的
,小数
,约会时间
, 或者细绳
(包括字符和二进制字符串)。整理ID
:直方图数据的归类ID。这是有意义的数据类型
价值是细绳
.值对应ID
列值Information_schema.collations.
表格
要从直方图对象中提取特定的值,您可以使用JSON
操作。例如:
mysql>选择table_name,column_name,直方图 - >>'$。“data-type”'作为'data-type',json_length(直方图 - >>'$。“桶”')从Information_schema中为“桶计数”。column_statistics;+ ---------------------------- + ----------- + -------------- + |table_name |column_name |数据类型|铲斗计数|+ ---------------------------- + ----------- + -------------- + |国家|人口|int | 226 | | city | Population | int | 1024 | | countrylanguage | Language | string | 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之间的订单中选择*;从TBL中选择*,其中Col1 = 15和Col2> 100;
与常量进行比较的要求包括常量函数,例如ABS()
和地板()
:
SELECT * FROM tbl WHERE col1 < ABS(-34);
直方图统计信息主要用于非indexed列。将索引添加到适用直方图统计信息的列可能也有助于优化程序使行估计。权衡是:
在修改表数据时,必须更新索引。
直方图仅根据需要创建或更新,因此在修改表数据时不会增加开销。另一方面,当表发生修改时,统计信息会逐渐过时,直到下一次更新它们。
优化器更喜欢从直方图统计器获得的范围优化器行估计。如果优化器确定范围优化程序适用,则不会使用直方图统计信息。
对于已索引的列,可以使用索引插入获得行估计值,以便进行相等比较(参见第8.2.1.2节“范围优化”)。在这种情况下,直方图统计不一定是有用的,因为索引潜水可以产生更好的估计。
在某些情况下,使用直方图统计信息可能无法改善查询执行(例如,如果统计信息过期)。要检查是否如此,请使用分析表
要重新生成直方图统计信息,然后再次运行查询。
或者,要禁用直方图统计信息,请使用分析表
放下它们。禁用直方图统计数据的不同方法是关闭condition_fanout_filter
旗帜Optimizer_Switch.
系统变量(尽管这可能会禁用其他优化):
SET Optimizer_Switch ='条件_fanout_filter = OFF';
如果使用直方图统计信息,则使用产生的效果解释
.请考虑以下查询,其中NO索引可用于列COL1.
:
从T1中选择*,其中col1 <24;
如果直方图统计表明57%的行中T1.
满足col1 <24.
谓词、过滤甚至可以在没有索引的情况下发生,并且解释
显示57.00过滤
柱子。