大家好,我是烤鸭:
    这是根据官方文档提炼出的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性能调优精简版相关推荐

  1. MySQL性能调优与架构设计——第5章 备份与恢复

    第5章 备份与恢复 前言 数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一.任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 MySQL数据库的备 ...

  2. 经典!《MySQL性能调优手册》高清电子版,限时 3 天免费下载

    点击上方"逆锋起笔",关注领取视频教程 ☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知的了,性能调优是MySQL ...

  3. 转】MYSQL性能调优与架构设计之select count(*)的思考

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/5/ 感谢! Posted: Feb 7, 2013 Tag ...

  4. MySQL性能调优与架构设计——第4章 MySQL安全管理

    第4章 MySQL安全管理 前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司的一切 ...

  5. MySQL 性能调优之存储引擎

    原文:http://bbs.landingbj.com/t-0-246222-1.html        http://bbs.landingbj.com/t-0-245851-1.html MySQ ...

  6. MySQL性能调优与架构设计——第11章 常用存储引擎优化

    第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...

  7. MySQL 性能调优和优化技巧

    介绍 MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据.对于大型应用程序,庞大的数据量可能会导致性能问题. 本指南提供了一些关于如何提高 MySQL 数据库性能 ...

  8. MySQL mysql性能调优

    MySQL性能调优,SQL优化.索引优化 慢查询日志 当查询超过一定的时间没有返回结果的时候,才会记录到慢查询日志中.默认不开启. 采样的时候手工开启.可以帮助我们找出执行慢的 SQL 语句 查看慢 ...

  9. mysql 读写分离缺点6_6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优

    6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优 day06 一,mysql 主从同步 二,数据读写分离 三,MySQL 优化 ++++++++++++++++++++++ ...

最新文章

  1. 色彩(颜色)空间原理(实现代码)
  2. 新晋 ACM Fellow 陶大程,8 篇 NeurIPS 论文详解
  3. 文字转语音引擎未就绪_5个文字转语音网站,其中最强堪比真人发音
  4. 什么是堆,栈,内存泄漏和内存溢出?
  5. 榜单类应用我所喜欢的算法
  6. 4.8地铁查询开发进度
  7. Android中的EditText默认时不弹出软键盘的方法
  8. 泛微OA的http接口创建
  9. WPF MVVM 框架
  10. 项目Kick Off的作用
  11. 【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码
  12. 将语雀文档迁移到飞书
  13. 获得淘系商品详情展示
  14. redis之发布订阅
  15. steam验证登录失败_如何向Steam添加两方面身份验证
  16. 计算机大赛剪辑的视频,视频剪辑大赛
  17. Visual Studio Code PlatformIo IDE 新建项目下载慢的解决办法
  18. 阿里CEO张勇:马云接班人,凭什么执掌4千亿美金公司?
  19. Python 基础数据结构
  20. uni-app的灰朦层取消滑动以及官方弹出框设计代码

热门文章

  1. 前端学习(3034):vue+element今日头条管理-markdown补充
  2. 前端学习(2765):如何传递事件和参数
  3. 前端学习(2586):如何设计高扩展路由
  4. 前端学习(2177):vue-router得参数传递
  5. 前端学习(1676):前端系列实战课程之贪吃蛇游戏设计
  6. 前端学习(1652):前端系列实战课程之bom
  7. 前端学习(1316):静态资源
  8. 第四十四期:1.3万亿条数据查询如何做到毫秒级响应?
  9. ubuntu设置root密码及 Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次...
  10. 一个设计项调另一个设计项(支持多选传值)