首页 > 数据库 >Mysql - 统计数据

Mysql - 统计数据

时间:2023-06-20 11:04:01浏览次数:58  
标签:stats name 统计数据 Mysql 索引 innodb mysql table


QA

统计数据是做什么的?

  • 为了解释器在计算代价时, 选择最优的方案. 这个值如果与实际值差距过大, 会导致执行顺序的变更.

统计数据有哪些?

  • 对表的统计数据 - mysql.innodb_table_stats
  • 对表索引的统计数据 - mysql.innodb_index_stats

统计数据存在哪?

  • 有两种方式, 一种存在磁盘, 一种存在内存
  • 5.6.6 版本之后, mysql默认存在磁盘中

如何保证统计数据的准确性?

  • 定期/手动更新统计数据的值

表统计信息

示例

mysql> select * from mysql.innodb_table_stats\G

*************************** 7. row ***************************
           database_name: yang                    	# 库名
              table_name: x											# 表名
             last_update: 2022-12-08 17:09:33			# 该数据最后更新时间
                  n_rows: 3								# 预估条目数
    clustered_index_size: 1								# 聚簇索引占叶子节点的页数
sum_of_other_index_sizes: 1								# 其他索引占叶子节点的页数

参数

  • innodb_stats_persistent_sample_pages 该参数影响持久性存储时, 采样页面的数量, 默认值为20
  • innodb_stats_transient_sample_pages - 该参数影响临时性统计时, 采样的页面数量, 默认值为8

说明

  • n_rows 是估值, 计算方式是从聚簇索引中(根据算法)选择几个叶子节点页面, 计算每个页面中平均条目数, 乘以总页数

存储方式

分类

  • 磁盘永久性存储
  • 内存临时性存储

设置

  • 全局变量设置
# 配置文件中定义, 5.6.6 之前默认在内存中,之后默认在磁盘中

# 存储在磁盘中
innodb_stats_persistent = ON
# 存储在内存中
innodb_stats_persistent = OFF
  • 单表设置
# 通过创建或修改表的时候指定
# 1表示存到磁盘,0表示存到内存
# 如果未指定使用系统变量

create table tabeName (
  ...
  ) engine=InnoDB, stats_persistent=(1|0);

查看

  • 查看全局变量
mysql> show global variables like 'innodb_stats_persistent';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| innodb_stats_persistent | ON    |
+-------------------------+-------+
  • 查看单表设置
mysql> show table status\G
*************************** 5. row ***************************
           Name: xx
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2022-12-12 00:14:22
    Update_time: NULL
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: NULL
 Create_options: stats_persistent=0          # <--- 这里能看到单独的设置信息, 使用全局设置的则该字段会为空
        Comment:

更新统计信息

自动更新

设置

  • 全局设置
innodb_stats_recalc = ON
  • 单表设置
# 1表示开启, 0表示不开启
# 默认是开启的

create table tabeName (
  ...
  ) engine=InnoDB, stats_auto_recalc=1

触发逻辑

  • 每个表有个变量, 记录了增删改的记录条目数, 如果记录数超过了表大小的10%则重新计算
  • 验证: 表中数据为20条时,插入约3条就会更新

手动更新

  • 手动调用更新
analyze table tableName;
  • 手动写入更新
update innodb_table_stats set n_rows=1 where table_name="xxx"';
flush table tableName;

表索引统计信息

  • 大体上与表统计信息逻辑相同

示例

mysql> select * from mysql.innodb_index_stats\G

*************************** 29. row ***************************
   database_name: yang									# 库名
      table_name: xx         						# 表名
      index_name: index_xx   						# 索引名
     last_update: 2022-12-08 17:09:19		# 最后更新时间
       stat_name: n_leaf_pages						# 统计项名称
      stat_value: 1									  	# 统计项的值
     sample_size: NULL									# 采样页面数量
stat_description: Number of leaf pages in the index		# 统计项的说明

关于索引的Null值处理

  • 首先在二级索引中, 可能出现null值, 那么mysql应该如何处理null值, 会影响索引的统计
  • 约定中, mysql 默认认为 null 值都是不相同的, 所以mysql提供了参数来修改这个认定 --> innodb_stats_method
  • nulls_equal 认为所有null都是相等的, 默认是这个
  • nulls_unequal 认为所有null都是不等的
  • nulls_ignored 忽略null

说明

  • 统计项名称
  • n_leaf_pages 该索引的叶子节点实际占用多少页面
  • size 该索引总共占用多少页面
  • n_diff_pfxNN 索引列不重复的值有多少(与null值如何处理有关联)


标签:stats,name,统计数据,Mysql,索引,innodb,mysql,table
From: https://blog.51cto.com/u_16165803/6521273

相关文章

  • MySql InnoDB 存储引擎表优化
    一、InnoDB表存储优化1、OPTIMIZETABLE适时的使用OPTIMIZETABLE语句来重组表,压缩浪费的表空间。这是在其它优化技术不可用的情况下最直接的方法。OPTIMIZETABLE语句通过拷贝表数据并重建表索引,使得索引数据更加紧凑,减少空间碎片。语句的执行效果会因表的不同而不同。过大......
  • 什么是MySQL
    什么是MySQLMySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。数据库的三大范式第一范式1NF确保数据库表字段......
  • 宝塔面板中使用Mysql命令快速导入大容量数据库
    在宝塔面板中,文件栏目中打开/www/backup/database文件夹,把我们的数据库上传到此文件夹中。(一般导入的数据库都会上传到这个文件夹,方便以后管理)点击旁边的终端,打开宝塔终端界面。输入账号及密码进入终端管理。(如果忘记密码,在软件商店里面找到Linux工具箱1.4里面可以设置......
  • MySQL的卸载、下载、安装详细讲解
    MySQL的卸载、下载、安装、环境变量配置、Navicat安装目录:本文比较长,详细说明了MySQL的卸载、下载、安装、环境变量配置、Navicat安装;顺序以目录为准。一、彻底卸载删除数据库二、下载MySQL数据库三、安装MySQL数据库——3.1,MySQL5.5.49版本的数据库——3.......
  • MySQL 基本语句总结
    MySQL语句,需要知道一下~总结的一些MySQL语句,仅供参考创建数据库createdatabasemydb1;createdatabaseifnotexistsmydb2charactersetGBK;#(不为空,字符集)createdatabasemydb3charactersetGBKcollategbk_chinese_ci;#(字符集,级别)查看所有数据库showdatab......
  • 错误:“java.lang.ClassNotFoundException: com.mysql.jdbc.Driver“ 如何解决?
    ——运行项目时遇到java.lang.ClassNotFoundException:com.mysql.jdbc.Driver问题,解决方案:错误如下:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver atorg.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1358) atorg.......
  • MySQL入门基础知识
    1MySQL基础1.1常用命令启动服务:netstart服务名停止服务:netstop服务名启动MySQL服务器:MySQL【-h主机名-P端口号】-u用户名-p密码查看MySQL版本:MySQL--version或MySQL–V或登录到MySQL服务端使用selectversion();1.2语法规范每条命令最好用分号结尾每条......
  • MySQL DQL语法汇总
    1数据准备1.1建表语句创建四个表:地址表、部门表、职位表和员工表:CREATETABLE`locations`(`location_id`INTNOTNULLAUTO_INCREMENT,`street_address`VARCHAR(40)DEFAULTNULL,`postal_code`VARCHAR(12)DEFAULTNULL,`city`VARCHAR(30)DEFAULTNULL,......
  • Docker PHP如何安装mysqli扩展
    查找用于安装PHP扩展的命令文件whichdocker-php-ext-install安装mysqli扩展docker-php-ext-installmysqli需要注意的是,docker-php-ext-install命令仅适用于基于PHP的Docker镜像,并且需要与DockerCompose文件一起使用,以便在容器中运行PHP应用程序。......
  • MYSQL经典练习题
    题目来源:https://blog.csdn.net/flycat296/article/details/63681089Github地址:https://github.com/bladeXue/sql50添加测试数据库信息#创建数据库createdatabasesql50;usesql50;#学生表createtableStudent(SIdvarchar(10),Snamevarchar(10),Sagedatetime,Sse......