当前位置: 首页 > news >正文

个人响应式网站建设/百度企业官网

个人响应式网站建设,百度企业官网,2008iis添加网站打不开,佛山网站建设公司 华欣世纪点击关注公众号,Java干货及时送达作者:LuHengXing 来源:http://www.dbapub.cn/2020/09/01/MySQL8.0直方图/查询优化器负责将SQL查询转换为尽可能高效的执行计划,但随着数据环境不断变化,查询优化器可能无法找到最佳的执…

点击关注公众号,Java干货及时送达c58ddb4be72dd88702396b25e229a250.png

作者:LuHengXing
来源:http://www.dbapub.cn/2020/09/01/MySQL8.0直方图/

查询优化器负责将SQL查询转换为尽可能高效的执行计划,但随着数据环境不断变化,查询优化器可能无法找到最佳的执行计划,导致SQL效率低下。造成这种情况的原因是优化器对查询的数据了解的不够充足,例如:每个表有多少行数据,每列中有多少不同的值,每列的数据分布情况。

因此MySQL8.0.3推出了直方图(histogram)功能,直方图是列的数据分布的近似值,其向优化器提供更多的统计信息。比如字段NULL的个数,每个不同值的百分比,最大/最小值等。

MySQL的直方图分为:等宽直方图和等高直方图,MySQL会自动分配使用哪种类型的直方图,无法干预

  • 等宽直方图:每个bucket保存一个值以及这个值的累计频率

  • 等高直方图:每个bucket保存不同值的个数,上下限以及累计频率

直方图同时也存在一定的限制条件:

  • 不支持几何类型以及json类型的列

  • 不支持加密表和临时表

  • 无法为单列唯一索引的字段生成直方图

创建和删除直方图

创建语法

ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name] WITH N BUCKETS;

创建直方图时能够同时为多个列创建直方图,但必须指定bucket数量,范围在1-1024之间,默认100。对于bucket数量应该综合考虑其有多少不同值、数据的倾斜度、精度等,建议从较低的值开始,不符合再依次增加。

删除语法

ANALYZE TABLE tbl_name DROP HISTOGRAM ON col_name [, col_name];

直方图信息

MySQL通过字典表column_statistics来保存直方图的定义,每行记录对应一个字段的直方图,已JSON格式保存。另外,MySQL 系列面试题和答案全部整理好了,大家可以在Java面试库小程序在线刷题。

root@employees 13:49:  select json_pretty(histogram) from information_schema.column_statistics where table_name='employees' and column_name='first_name';;
{"buckets": [["base64:type254:QWFtZXI=","base64:type254:QWRlbA==",0.010176045588684237,13],"data-type": "string","null-values": 0.0,"collation-id": 255,"last-updated": "2020-09-09 05:47:32.548874","sampling-rate": 0.163495700259278,"histogram-type": "equi-height","number-of-buckets-specified": 100
}

MySQL为employees的first_name字段分配了等高直方图,默认为100个bucket。

当生成直方图时,MySQL会将所有数据都加载到内存中,并在内存中执行所有工作。如果在大表上生成直方图,可能会将几百M的数据读取到内存中的风险,因此我们可以通过参数hitogram_generation_max_mem_size来控制生成直方图最大允许的内存量,当指定内存满足不了所有数据集时就会采用采样的方式。

root@employees 14:12:  select histogram->>'$."sampling-rate"' from information_schema.column_statistics where table_name='employees' and column_name='first_name';;
+---------------------------------+
| histogram->>'$."sampling-rate"' |
+---------------------------------+
| 0.163495700259278               |
+---------------------------------+

从MySQL8.0.19开始,存储引擎自身提供了存储在表中数据的采样实现,存储引擎不支持时,MySQL使用默认采样需要全表扫描,这样对于大表来说成本太高,采样实现避免了全表扫描提高采样性能。

关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java/ MySQL 系列面试题和答案,非常齐全。

通过INNODB_METRICS计数器可以监视数据页的采样情况,这需要提前开启计数器

root@employees 14:26:  SELECT NAME, COUNT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'sampled%'\G
*************************** 1. row ***************************NAME: sampled_pages_read
COUNT: 430
*************************** 2. row ***************************NAME: sampled_pages_skipped
COUNT: 456
2 rows in set (0.04 sec)

采样率的计算公式为:sampled_page_read/(sampled_pages_read + sampled_pages_skipped)

优化案例

复制一张表出来,源表不添加直方图,新表添加直方图

root@employees 14:32:  create table employees_like like employees;
Query OK, 0 rows affected (0.03 sec)root@employees 14:33:  insert into employees_like select * from employees;
Query OK, 300024 rows affected (3.59 sec)
Records: 300024  Duplicates: 0  Warnings: 0root@employees 14:33:  ANALYZE TABLE employees_like update HISTOGRAM on birth_date,first_name;
+--------------------------+-----------+----------+-------------------------------------------------------+
| Table                    | Op        | Msg_type | Msg_text                                              |
+--------------------------+-----------+----------+-------------------------------------------------------+
| employees.employees_like | histogram | status   | Histogram statistics created for column 'birth_date'. |
| employees.employees_like | histogram | status   | Histogram statistics created for column 'first_name'. |
+--------------------------+-----------+----------+-------------------------------------------------------+

分别在两张表上查看SQL的执行计划

root@employees 14:43:  explain format=json select count(*) from employees where (birth_date between '1953-05-01' and '1954-05-01') and first_name like 'A%';
{"query_block": {"select_id": 1,"cost_info": {"query_cost": "30214.45"},"table": {"table_name": "employees","access_type": "ALL","rows_examined_per_scan": 299822,"rows_produced_per_join": 3700,"filtered": "1.23","cost_info": {"read_cost": "29844.37","eval_cost": "370.08","prefix_cost": "30214.45","data_read_per_join": "520K"},"used_columns": ["birth_date","first_name"],"attached_condition": "((`employees`.`employees`.`birth_date` between '1953-05-01' and '1954-05-01') and (`employees`.`employees`.`first_name` like 'A%'))"}}
}root@employees 14:45:  explain format=json select count(*) from employees where (birth_date between '1953-05-01' and '1954-05-01') and first_name like 'A%';
{"query_block": {"select_id": 1,"cost_info": {"query_cost": "18744.56"},"table": {"table_name": "employees","access_type": "range","possible_keys": ["idx_birth","idx_first"],"key": "idx_first","used_key_parts": ["first_name"],"key_length": "58","rows_examined_per_scan": 41654,"rows_produced_per_join": 6221,"filtered": "14.94","index_condition": "(`employees`.`employees`.`first_name` like 'A%')","cost_info": {"read_cost": "18122.38","eval_cost": "622.18","prefix_cost": "18744.56","data_read_per_join": "874K"},"used_columns": ["birth_date","first_name"],"attached_condition": "(`employees`.`employees`.`birth_date` between '1953-05-01' and '1954-05-01')"}}
}

可以看出Cost值从30214.45降到了18744.56,扫描行数从299822降到了41654,性能有所提升。另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 MySQL 系列面试题和答案,非常齐全。

参考资料:

https://dev.mysql.com/doc/refman/8.0/en/analyze-table.html#analyze-table-histogram-statistics-analysis
https://mysqlserverteam.com/histogram-statistics-in-mysql/

55a30993a630d90acf163a51ba3145da.gif

e75693209bc053ef4296c80f38175a98.png

Spring Boot 定时任务开启后,怎么自动停止?

Java 8 排序的 10 个姿势,太秀了吧!

23 种设计模式实战(很全)

Spring Boot 保护敏感配置的 4 种方法!

面了个 5 年 Java,两个线程数据交换都不会!

阿里为什么推荐使用 LongAdder?

新来一个技术总监:禁止戴耳机写代码。。

别用 System... 计时了,StopWatch 好用到爆!

Java 18 正式发布,finalize 被弃用。。

Spring Boot Admin 横空出世!

Spring Boot 学习笔记,这个太全了!

关注Java技术栈看更多干货

b04f64185236ff2f53aa4f5409bddd0a.png

9fdf1199b576f4f53e08f447802857c0.gif

获取 Spring Boot 实战笔记!

http://www.lbrq.cn/news/1069687.html

相关文章:

  • 江苏省建设集团是国企吗/爱站网seo培训
  • 深圳网站建设软件开发公司/今日重大事件
  • 淘宝客如何做免费的网站/品牌型网站设计推荐
  • 做众筹网站需要什么条件/快速收录域名
  • 南陵网站建设/上海牛巨微网络科技有限公司
  • 网站建设质量保证金/营销策划案
  • 绿色大气5.7织梦网站模版/网站关键词怎么设置
  • 网站右边上下浮动代码/优化网站的方法
  • 投资项目网站建设方案/学大教育培训机构电话
  • 满山红网站建设/重庆关键词排名推广
  • 大庆市工程建设信息去哪个网站/成都seo培训
  • 政府网站功能模块有哪些/单页网站排名优化
  • 学编程入门/百家号优化
  • 易托管建站工具/服务营销论文
  • 做网站的电话号码/seo优化对网店的推广的作用为
  • 做男鞋的网站/站长工具whois查询
  • app开发公司介绍/百度关键词seo
  • 做任务挣钱的网站聚/蜜雪冰城网络营销案例分析
  • 大专生毕业论文怎么写/seochan是什么意思
  • 深圳网站建设艺之都/代写文章哪里找写手
  • 安徽省住房和城乡建设委员会网站/微信投放广告多少钱
  • 洛阳青峰网络公司做网站/广告传媒公司经营范围
  • 做网站的像素/中山seo排名
  • 网络宣传策划方案模板/seo关键词查询排名软件
  • 托管服务器是什么意思/优化百度搜索
  • 外链都没有的网站如何做排名的/教育培训网站官网
  • 织梦免费机械网站源码/爱战网关键词挖掘
  • 自己做彩票网站犯法吗/三十个知识点带你学党章
  • wordpress导购插件/视频优化是什么意思
  • 个人博客页面模板/优化推广网站排名
  • 从传热学基础到有限元弱形式推导:拆解热传导问题Matlab有限元离散核心
  • kafka 是一个怎样的系统?是消息队列(MQ)还是一个分布式流处理平台?
  • vue3渲染html数据并实现文本修改
  • 堆----1.数组中的第K个最大元素
  • Qt 开发 IDE 插件开发指南
  • 安全月报 | 傲盾DDoS攻击防御2025年7月简报