mysql性能调优精简版
大家好,我是烤鸭:
这是根据官方文档提炼出的mysql性能优化总结。
想看完整翻译版的请看 https://blog.csdn.net/Angry_Mills/article/details/87720396
1. 成本优化
成本包含: IO 和 CPU 从硬盘读取的花费
模型包含: 全表扫描(IO成本:表中的pages * IO阻塞读取成本 CPU成本: 行 * 行计算成本) 和 范围索引扫描(IO成本:范围中的行 * IO阻塞读取成本 IO成本:范围中的行 * 行计算成本)
2. 利用工具监视sql
MySQL Enterprise Monitor (MEM), Query Analyzer
Performance schema 执行计划
events_statements_history,events_statements_history_long
大部分最近执行的statement
events_statements_summary_by_digest
总结相似操作(相同的statement合并)
file_summary_by_event_name
Interesting event: wait/io/file/innodb/innodb_data_file
table_io_waits_summary_by_table
table_io_waits_summary_by_index_usage
统计存储引擎的每个表和索引
EXPLAIN/EXPLAIN FORMAT=JSON
调试查询计划:
SELECT trace FROM information_schema.optimizer_trace INTO OUTFILE <filename> LINES TERMINATED BY '';
SET optimizer_trace="enabled=off";
3.数据访问和索引优化
使用索引/添加索引/复合索引/索引合并
注意低选择性的索引!(字段长度或者变量比较少,比如sex int 1)
4.连接优化
找到最好的连接顺序
使用 STRAIGHT_JOIN
优化连接顺序
对非索引列进行过滤
部分表强制提前处理无需暗示
将派生表合并到外部查询中
无临时表
5.子查询优化
IN 转换为 EXISTS
例子:
SELECT title FROM film WHERE film_id IN (SELECT film_id FROM actor WHERE name=“Bullock”)
=> SELECT title FROM filmWHERE EXISTS (SELECT 1 FROM actor WHERE name=“Bullock” AND film.film_id = actor.film_id)
优势:子查询将计算更少的记录
Semi-join 半连接
将子查询转换为内连接,但需要一些方法去重
匹配优先(等价于IN—>EXISTS的方式)
懒扫描(索引扫描,跳过重复)
实体化 MatLookup(像子查询实体化),MatScan(实体化表在连接顺序的第一位)
去重(用唯一索引将半连接的行插入临时表;重复列将会被拒绝。无论连接顺序)
优势:有更多优化"连接顺序"的选择
限制:如果子查询包含union(并集)或者aggregation(聚合)不能使用半连接
子查询实例化:
执行一次子查询并在临时表中存结果,表有唯一索引可以快速查找并去重
执行外部查询并检查临时表中的匹配项
派生表:
例子:
SELECT AVG(o_totalprice) FROM ( SELECT * FROM orders ORDER BY o_totalprice DESC LIMIT 100000 ) td;
mysql 5.6 以前 : 单独执行并将结果存储在临时表中(实现)
mysql 5.7 处理类似于视图的派生表:可以与外部查询块合并
注意:用外部连接合并派生表,基于GROUP BY,DISTINCT,LIMIT或聚合函数的派生表将不会合并
外部查询与派生表MERGE
NO_MERGE: 可用于覆盖默认行为
SELECT /*+ NO_MERGE(dt) */ * FROM t1 JOIN (SELECT x, y FROM t2) dt ON t1.x = dt.x;
MERGE: 强制合并
SELECT /*+ MERGE(dt) */ * FROM t1 JOIN (SELECT x, y FROM t2) dt ON t1.x = dt.x;
也可以使用MERGE / NO_MERGE暗示查看视图
SELECT /*+ NO_MERGE(v) */ * FROM t1 JOIN v ON t1.x = v.x;
6.排序
通常的解决方案;"FileSort"
在排序之前将查询结果存储在临时表中
如果数据量很大,可能需要在磁盘上使用中间存储进行多次传递排序
优化
利用索引按排序顺序生成查询结果
对于"LIMIT n查询,保留内存中n个顶级项的优先级队列而不是文件排序。
执行计划
可从执行计划中对每个语句进行排序
优化方式
增加排序缓冲区 SET sort_buffer_size = 8*1024*1024;
使用索引避免排序
重新研究案例
7.影响的优化器
增加索引
强制使用特定索引 使用索引,强制索引,忽略索引
强制特定的关联顺序
STRAIGHT_JOIN
调整会话变量
set optimizer_switch="index_merge=off";set sort_buffer=8*1024*1024;set optimizer_search_depth = 10;
mysql 5.7 优化
(BKA) 批量key访问 (BNL) 阻塞嵌套循环算法
(Multi-Range Read ) 多范围读取 (表的索引)
连接和子查询(策略)
命中索引的情况
范围优化(索引)
阻塞查询
未来 mysql 8.0 语法可能的优化:
启用/禁用视图和派生表的合并
MERGE() NO_MERGE()
连接顺序
考虑添加的暗示:
强制/忽略index_merge替代方案
重新实现新语法中的索引暗示
暂时为一个查询设置会话变量
mysql 5.7 重写查询插件
无需更改应用程序即可重写有问题的查询
更新连接顺序... 更多
向表中添加重写规则
可调成本常量(不建议使用)
mysql性能调优精简版相关推荐
- MySQL性能调优与架构设计——第5章 备份与恢复
第5章 备份与恢复 前言 数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一.任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 MySQL数据库的备 ...
- 经典!《MySQL性能调优手册》高清电子版,限时 3 天免费下载
点击上方"逆锋起笔",关注领取视频教程 ☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知的了,性能调优是MySQL ...
- 转】MYSQL性能调优与架构设计之select count(*)的思考
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/5/ 感谢! Posted: Feb 7, 2013 Tag ...
- MySQL性能调优与架构设计——第4章 MySQL安全管理
第4章 MySQL安全管理 前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司的一切 ...
- MySQL 性能调优之存储引擎
原文:http://bbs.landingbj.com/t-0-246222-1.html http://bbs.landingbj.com/t-0-245851-1.html MySQ ...
- MySQL性能调优与架构设计——第11章 常用存储引擎优化
第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...
- MySQL 性能调优和优化技巧
介绍 MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据.对于大型应用程序,庞大的数据量可能会导致性能问题. 本指南提供了一些关于如何提高 MySQL 数据库性能 ...
- MySQL mysql性能调优
MySQL性能调优,SQL优化.索引优化 慢查询日志 当查询超过一定的时间没有返回结果的时候,才会记录到慢查询日志中.默认不开启. 采样的时候手工开启.可以帮助我们找出执行慢的 SQL 语句 查看慢 ...
- mysql 读写分离缺点6_6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优
6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优 day06 一,mysql 主从同步 二,数据读写分离 三,MySQL 优化 ++++++++++++++++++++++ ...
最新文章
- 色彩(颜色)空间原理(实现代码)
- 新晋 ACM Fellow 陶大程,8 篇 NeurIPS 论文详解
- 文字转语音引擎未就绪_5个文字转语音网站,其中最强堪比真人发音
- 什么是堆,栈,内存泄漏和内存溢出?
- 榜单类应用我所喜欢的算法
- 4.8地铁查询开发进度
- Android中的EditText默认时不弹出软键盘的方法
- 泛微OA的http接口创建
- WPF MVVM 框架
- 项目Kick Off的作用
- 【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码
- 将语雀文档迁移到飞书
- 获得淘系商品详情展示
- redis之发布订阅
- steam验证登录失败_如何向Steam添加两方面身份验证
- 计算机大赛剪辑的视频,视频剪辑大赛
- Visual Studio Code PlatformIo IDE 新建项目下载慢的解决办法
- 阿里CEO张勇:马云接班人,凭什么执掌4千亿美金公司?
- Python 基础数据结构
- uni-app的灰朦层取消滑动以及官方弹出框设计代码
热门文章
- 前端学习(3034):vue+element今日头条管理-markdown补充
- 前端学习(2765):如何传递事件和参数
- 前端学习(2586):如何设计高扩展路由
- 前端学习(2177):vue-router得参数传递
- 前端学习(1676):前端系列实战课程之贪吃蛇游戏设计
- 前端学习(1652):前端系列实战课程之bom
- 前端学习(1316):静态资源
- 第四十四期:1.3万亿条数据查询如何做到毫秒级响应?
- ubuntu设置root密码及 Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次...
- 一个设计项调另一个设计项(支持多选传值)