• MySQL 配置统计数据


    MySQL 配置统计数据

    1. 什么是统计数据

    MySQL 为了制定执行计划收集表的相关信息,如索引行数,索引基数(不同值的数量),占用页面数等等。这些信息被称为统计数据

    同一条 sql 语句,在不同的数据量级下,不同的索引结构下,执行计划都是千差万别的。
    而 MySQL 选定执行计划的标准就是这些统计数据。

    2. 统计数据怎么存储

    2.1 两种存储方式

    1. 基于磁盘的永久性存储
    2. 基于内存的非永久性存储
    

    默认情况下,MySQL 配置为持久化到磁盘,咱们这次也只讨论持久化到磁盘的形式,因为基于内存的形式统计的数据与其相同。
    在全局变量中有两个值来标志是否是用磁盘来存储
    rVXOEj

    innodb_stats_persistent:是否使用磁盘
    Innodb_stats_persistent_sample_pages:统计数据的抽样页面数

    2.1.1 存储形式

    cLC0rO

    可以看到有两个表存储数据统计信息:innodb_table_stats & innodb_index_stats

    2.2 存储的信息

    首先来看 innodb_table_stats 中存储结构
    SOEozp

    字段含义:

    字段 含义
    database_name 数据库
    table_name 表名
    last_update 上次更新时间
    n_rows 表中行数
    clustered_index_size 聚簇索引占用的页面数
    sum_of_other_index_sizes 除了聚簇索引之外的其他索引站用的页面数

    再来看一下 innodb_index_stats 中的信息
    -w1227

    字段 含义
    database_name 数据库
    table_name 表名
    index_name 索引名称
    last_update 上次更新时间
    stat_name 可以看到最后一列的 stat_description 中有解释这一列是什么意思
    n_leaf_pages: 叶子页面的数量
    size: 总页面数。
    值得注意的是, n_diff_pfx01n_diff_pfx02, 这两个是联合索引中前缀索引的不同部分。
    stat_value 统计出的数值
    sample_size 为了统计上一个数值用了多少个页面
    stat_description 对统计数据的简介

    3. 如何更新统计数据

    这些统计数据并非是一成不变的,否则数据库的执行计划会变得特别不准确。
    有两种方式来启用统计数据更新:
    • 开启 innodb_stats_auto_recalc (在页面变动超过 10%【定义值】 时,触发统计数据的计算,异步过程,不会阻塞)
    • 手动调用 ANALYZE TABLE 语句来更新统计信息 (同步过程,会阻塞请求)

    4. NULL 值如何统计

    现在一切都很正常,除了 NULL (万恶之源)
    因为 NULL 有多重语义,对于基数来说,有三种解释:

    1. 列中所有的 NULL 都是同一个值,记为 1

    2. 忽略 NULL,记为 0

    3. 每个 NULL 都算作一个不同的值,记为 N

    基于这个事实,mysql 为用户提供了一个可配置的系统变量: innodb_stats_method

    1. nulls_equal:对应上文 1

    2. nulls_unequal:对应上文 2

    3. nulls_ignored:对应上文 3

    建议:最好不要在索引列中存放 NULL 值

    5. 参考文档

    《MySQL 是怎样运行的:从根儿上理解 MySQL》
    《MySQL 手册》

  • 相关阅读:
    Failed at the node-sass@4.13.1 postinstall script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    页面跳转
    多行文字溢出显示省略号
    iview-select选择器组件的使用&设置默认选中的值
    iview中表单验证(遇到的问题)
    iview DatePicker type 为dateTime 时无法做表单验证!
    报错:[Vue warn]: Error in callback for watcher "value": "Value should be trueValue or falseValue."
    Jquery 数字滚动兼容小数
    validate表单验证-单独验证
    2020软件工程作业03
  • 原文地址:https://www.cnblogs.com/wudanyang/p/mysql-tong-ji-shu-ju-shi-ru-he-shou-ji-de.html
Copyright © 2020-2023  润新知