问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MySQL统计数据

发布网友 发布时间:2022-04-24 10:09

我来回答

2个回答

懂视网 时间:2022-05-05 06:08

本篇文章通过统计信息的概念介绍以及MYSQL统计信息的优势等方面全面概述了MySQL统计信息的相关知识点,希望可以帮助到有需求的朋友们。

MySQL执行SQL会经过SQL解析和查询优化的过程,解析器将SQL分解成数据结构并传递到后续步骤,查询优化器发现执行SQL查询的最佳方案、生成执行计划。查询优化器决定SQL如何执行,依赖于数据库的统计信息,下面我们介绍MySQL 5.7中innodb统计信息的相关内容。

MySQL统计信息的存储分为两种,非持久化和持久化统计信息。

一、非持久化统计信息

非持久化统计信息存储在内存里,如果数据库重启,统计信息将丢失。有两种方式可以设置为非持久化统计信息:

1 全局变量,

INNODB_STATS_PERSISTENT=OFF

2 CREATE/ALTER表的参数,

STATS_PERSISTENT=0

非持久化统计信息在以下情况会被自动更新:

1 执行ANALYZE TABLE

2 innodb_stats_on_metadata=ON情况下,执SHOW TABLE STATUS, SHOW INDEX, 查询 INFORMATION_SCHEMA下的TABLES, STATISTICS

3 启用--auto-rehash功能情况下,使用mysql client登录

4 表第一次被打开

5 距上一次更新统计信息,表1/16的数据被修改

非持久化统计信息的缺点显而易见,数据库重启后如果大量表开始更新统计信息,会对实例造成很大影响,所以目前都会使用持久化统计信息。

二、持久化统计信息

5.6.6开始,MySQL默认使用了持久化统计信息,即INNODB_STATS_PERSISTENT=ON,持久化统计信息保存在表mysql.innodb_table_stats和mysql.innodb_index_stats。

持久化统计信息在以下情况会被自动更新:


1 INNODB_STATS_AUTO_RECALC=ON

情况下,表中10%的数据被修改

2 增加新的索引

innodb_table_stats是表的统计信息,innodb_index_stats是索引的统计信息,各字段含义如下:

innodb_table_stats

database_name

数据库名

table_name

表名

last_update

统计信息最后一次更新时间

n_rows

表的行数

clustered_index_size

聚集索引的页的数量

sum_of_other_index_sizes

其他索引的页的数量


innodb_index_stats

database_name

数据库名

table_name

表名

index_name

索引名

last_update

统计信息最后一次更新时间

stat_name

统计信息名

stat_value

统计信息的值

sample_size

采样大小

stat_description

类型说明

为更好的理解innodb_index_stats,建一张测试表做说明:

CREATE TABLE t1 (
 a INT, b INT, c INT, d INT, e INT, f INT,
 PRIMARY KEY (a, b), KEY i1 (c, d), UNIQUE KEY i2uniq (e, f)
) ENGINE=INNODB;

写入数据如下:

查看t1表的统计信息,需主要关注stat_name和stat_value字段

tat_name=size时:stat_value表示索引的页的数量

stat_name=n_leaf_pages时:stat_value表示叶子节点的数量

stat_name=n_diff_pfxNN时:stat_value表示索引字段上唯一值的数量,此处做一下具体说明:

1、n_diff_pfx01表示索引第一列distinct之后的数量,如PRIMARY的a列,只有一个值1,所以index_name='PRIMARY' and stat_name='n_diff_pfx01'时,stat_value=1。

2、n_diff_pfx02表示索引前两列distinct之后的数量,如i2uniq的e,f列,有4个值,所以index_name='i2uniq' and stat_name='n_diff_pfx02'时,stat_value=4。

3、对于非唯一索引,会在原有列之后加上主键索引,如index_name='i1' and stat_name='n_diff_pfx03',在原索引列c,d后加了主键列a,(c,d,a)的distinct结果为2。

了解了stat_name和stat_value的具体含义,就可以协助我们排查SQL执行时为什么没有使用合适的索引,例如某个索引n_diff_pfxNN的stat_value远小于实际值,查询优化器认为该索引选择度较差,就有可能导致使用错误的索引。

三、统计信息不准确的处理

我们查看执行计划,发现未使用正确的索引,如果是innodb_index_stats中统计信息差别较大引起,可通过以下方式处理:

1、手动更新统计信息,注意执行过程中会加读锁:

ANALYZETABLE TABLE_NAME;

2、如果更新后统计信息仍不准确,可考虑增加表采样的数据页,两种方式可以修改:

a) 全局变量INNODB_STATS_PERSISTENT_SAMPLE_PAGES,默认为20;

b) 单个表可以指定该表的采样:

ALTER TABLE TABLE_NAME STATS_SAMPLE_PAGES=40;

经测试,此处STATS_SAMPLE_PAGES的最大值是65535,超出会报错。

目前MySQL并没有提供直方图的功能,某些情况下(如数据分布不均)仅仅更新统计信息不一定能得到准确的执行计划,只能通过index hint的方式指定索引。新版本8.0会增加直方图功能,让我们期待MySQL越来越强大的功能吧!

相关推荐:

实例解析:统计信息管理、Spring注解开发和EasyUI

收集SQL Server统计信息_PHP教程

热心网友 时间:2022-05-05 03:16

您好,单个select语句实现MySQL查询统计次数的方法用处在哪里呢?用处太多了,比如一个成绩单,你要查询及格得人数与不及格的人数,怎么一次查询出来?
MySQL查询统计次数简单的语句肯定是这样了:
select a.name,count_neg,count_plus from

(select count(id) as count_plus,name from score2 where score >=60 group by name) a,
(select count(id) as count_neg,name from score2 where score <=60 group by name) b
where a.name=b.name

即必须至少用2个语句。

今天刚好碰到发现mysql支持if,那就创造性的用if来实现吧:
select name, sum(if(score>=60,1,0)),sum(if(score<60,1,0)) from score2 group by name

单个select语句实现MySQL查询统计次数的方法简单吧。

原理就是大于60,就赋值为1,那么sum就是计数了。追问谢谢你的回答,但是文不对题意

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 41岁阿娇离婚后首次露面,身材胖到认不出,对此你怎么看? 面包机能加热到600℃吗? mysql中如何查询一周(周一至周日)和一个月(自然月)销售数据(字段-sale... 工业电烤箱预设600度,烤到500度左右就自动跳闸是什么原因? mysql 设计定时器问题:假设有表A、B、C。怎样设计另外的表和定时器... 烤枪最高温度600左右? SQL语句统计每天、每月、每年的销售总额 mysql 查询本周数据 mysql查询每周的数据,求高手解答! mysql如何查询一周内表格数据的值 mysql的函数YEARWEEK统计本周数据默认从周一统计还是周日统计? mysql查询一周内每天的记录数。 mysql中通过关键字进行分组,来统计本月每周的数据 MYSQL查询一周内的数据(最近7天的)怎么写 mysql mysql怎么按照自己定义的周统计每周的数据 一部手机支持部分B41频段区域移动有4G,请问大概什么样的区域有这样的频段? 看手机是支持TDD LTE还是FDD LTE,是不是看手机所支持的LTE的所在频段是多少? iphone 6s韩版手机支持B2和B4频段吗 中信信用卡实际额度是15000元刷卡透支额度是多少? 请问华为畅想7Plus支持B2,B4频段吗? 双层玻璃杯,夹层的杂质,脏东西,还可以去除吗? 用600°的高温烘烤,可以去除吗? 与蒋勤勤、金巧巧并称”北电三朵花”的她为何一直不红? MySQL中统计一天之内每个时间段内的数据,很急 请问烧烤时,碳燃烧的温度是多少呢,烧烤架位置空气温度大概是多少呢... mysql 如何统计多少条数据 用烤箱烤白薯烤多长时间 mysql 统计一段时间内每天1-24的数据,无数据补0 中考报考时是非深户,深户正在办理,考后入了深户,可以更改档案吗? 67.烤枪最高温为多少度? MySQL中如何按月统计数据 现在主播前景如何? 烘烤陶瓷最适合温度多少? 请问mysql查询上周数据的where条件怎么写(create_date) 跪求动漫(很久的了、80后入) 炭烤温度和电烤温度差多少 想去一些动画培训学校学习转行做动画。现在的工作工资也就4000—5000 不知道培训学校出来后入动 炭火烧烤时肉所承受的温度是多少? 2011年度购入电子设备后入固定资产科目,但一直没有计提折旧,现在2012年要调整,该怎么调?急~~~在线等 有烤箱可以烤二百到六百度之间的吗 自己原来单位有社保后入公司