介绍
首先统计信息的内容是啥?它的作用是什么?
统计信息分为表的基础信息统计,有大概多少行,有多少列,列的数据分布是什么样的,列的数据离散程度怎么样等。还有索引的统计信息,比如索引的选择度,索引列的数据分布等高直方图 频率直方图信息,有了这些信息是做什么用的呢?这里就涉及到索引的使用了。一个sql执行数据库到底是要不要用索引,数据库是要在执行之前是要评估它的执行成本的,而评估成本就需要知道一些数据,比如这个列虽然有索引,但是如果列的数据大部分是重复的数据,如果执行的sql中用到的值就是重复的比较多,那么这种查询使用索引就反而比全表扫描成本更高,所以数据库就提前知道这些数据才能更好的评估。所以统计信息的作用就在此。所以对于数据库优化来说统计了解统计信息是很有必要的。当然统计信息维持也是需要消耗数据库性能的,这个时候就需要评估统计信息更新的频率和采样的样本数。如果统计信息太老了不能反应当前数据库的数据实际分布的话 就可能导致数据库选择索引时出错。
对于统计信息,InnoDB的统计信息可以通过`SHOW TABLE STATUS`或者查询`information_schema`数据库中的表来获取,比如`information_schema.TABLES`和`information_schema.STATISTICS`。这些信息包括表的行数、数据长度、索引基数等。但需要注意的是,这些统计信息有时是估计值,尤其是当表很大时,可能不是实时更新的。
接下来是直方图信息。MySQL从8.0版本开始支持直方图统计信息,用于帮助优化器更好地估计数据分布,特别是当数据分布不均匀时。直方图可以通过`ANALYZE TABLE`命令来创建或更新,然后使用`information_schema.COLUMN_STATISTICS`来查看。需要确认用户使用的MySQL版本是否支持直方图,因为如果版本低于8.0,可能无法使用这个功能。
在MySQL中,直方图分为两种类型:等宽直方图(SINGLETON)和等高直方图(EQUI-HEIGHT)。等宽直方图每个桶代表一个单一的值及其频率,适合数据分布中有很多重复值的情况。而等高直方图每个桶包含大致相同数量的行,适合数据分布范围广但频率相近的情况。
需要告诉用户如何创建直方图,使用`ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name WITH n BUCKETS;`命令,然后查询`information_schema.CO