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 重写查询插件
        无需更改应用程序即可重写有问题的查询
            更新连接顺序... 更多
                向表中添加重写规则
         可调成本常量(不建议使用)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试总结

1. HashMap与HashTable的区别 Hashmap的key、value都可以为空&#xff0c;但key只能有一个为空&#xff0c;value可以有多个&#xff0c;非同步 HashTable的key、value都不能为空&#xff0c;是同步的&#xff0c;线程安全 因为hashtable,concurrenthashmap它们是用于多线程的&…

[css] 如何使用css3实现一个div设置多张背景图片?

[css] 如何使用css3实现一个div设置多张背景图片&#xff1f; background-image:url("1.jpg"),url("2.jpg"),url("3.jpg"); background-repeat: no-repeat, no-repeat, no-repeat; background-position: 0 0, 200px 0, 400px 201px;个人简介 我…

系统架构设计师-软件水平考试(高级)-理论-操作系统

系统架构设计师-操作系统 前言&#xff1a; 之前文章发布后&#xff0c;发现还是有一定阅读量的&#xff0c;所以决定继续发一些思维导图。 思维导图首先以思维结构为主&#xff0c;其次以考试的内容进行一定的改动&#xff08;如本次&#xff0c;将“嵌入系统”放在了“操作系…

Error: Cannot find module 'json-schema-faker' YAPI部署

大家好&#xff0c;我是烤鸭&#xff1a; 采坑实录。 安装 YAPI 接口项目时出现的这个问题&#xff0c;如果你不是这个情况出现的这个报错&#xff0c;就不用继续看了。 YAPI的 github 地址: https://github.com/YMFE/yapi 1.场景 安装 YAPI 接口项目。当时日志没找&#xff0c…

[css] 你有用过IE css的expression表达式吗?说说你对它的理解和它有什么作用呢?

[css] 你有用过IE css的expression表达式吗&#xff1f;说说你对它的理解和它有什么作用呢&#xff1f; 主要用来解决IE 低版本样式自适应的问题。 比如&#xff1a;height:expression(this.offsetHeight); 缺点&#xff1a;性能问题&#xff0c;会重复执行&#xff0c;可达 10…

Java 面试题(1)——java基础

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一些Java面试题和答案。 这些答案都是自己想的&#xff0c;如果有理解不一样的&#xff0c;欢迎交流。 部分原题来自&#xff1a; https://blog.csdn.net/qq_41790443/article/details/80694415 1. HashMap的源码&#xff0…

关于我的代码在课上第一时间没有运行出来这件事

日期&#xff1a;2018.11.15 博客期&#xff1a;024 星期四 今天上课老师又出题了&#xff0c;这次的题目是去利用文件的读写去完成文件的读写答题&#xff01;那为什么我没有第一时间做出来呢&#xff1f;原因我分析了以下几点&#xff1a; 1、我第一时间对题意没有准确的审视…

[css] 有哪些方式可以对一个DOM设置它的CSS样式?

[css] 有哪些方式可以对一个DOM设置它的CSS样式&#xff1f; 1.可以使用行内样式 2.可以使用style标签 3.可以使用link引入css文件 4.可以使用js动态修改个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

【Shiro】Unsatisfied dependency expressed through method 'securityManager' parameter 3

大家好&#xff0c;我是烤鸭&#xff1a; 采坑记录&#xff0c;springboot 整合 shiro。 环境&#xff1a; springboot 2.0.5.RELEASE shiro-spring 1.4.0 shiro-redis 3.1.0 1.问题 org.springframework.beans.factory.UnsatisfiedDependencyException: Error crea…

pytest+allure生成漂亮的报告+显示

一&#xff1a;环境准备 1.python3.62.windows环境3.pycharm4.pytest-allure-adaptor5.allure2.8.06.java1.8pytest-allure-adaptor快速安装 在cmd中输入 pip install pytest-allure-adaptor&#xff0c;回车 二&#xff1a;报告生成 第1步&#xff1a;下载allure.zip&#xff…

[css] 举例说明实现圆角的方式有哪些?

[css] 举例说明实现圆角的方式有哪些&#xff1f; 不使用 border-radius 的情况下只能用切图代替。此时非常有局限性&#xff0c;因为必须要定高定宽了。最常用的 border-radius 来实现。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; …

springboot项目 tomcat8.x 频繁宕机 原因分析

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一次线上tomcat宕机原因。 1 . 最近两次的宕机时间部分日志 1.1 2019-04-04 13:22:27.187 [Thread-10] INFO o.s.context.support.DefaultLifecycleProcessor - Stopping beans in phase 0 2019-04-04 13:22:27.188 [Thread…

Linux内核程序的编译:模块化编译

内核在编译的时候&#xff0c;可以支持单独模块化编译&#xff0c;只需要一个小小的Makefile即可搞定。 步骤如下&#xff1a; 1.在任意位置创建目录 vim Makefile 2.在Makefile中添加如下代码(我的kernel目录是/opt/kernel_xilinx_v4.4)&#xff1a; obj-m my_drv.oall:make …

[css] 有用过scss和sass吗?说说它们之间的区别是什么?

[css] 有用过scss和sass吗&#xff1f;说说它们之间的区别是什么&#xff1f; sass和scss其实是一样的css预处理语言&#xff0c;其后缀名是分别为 .sass和.scss两种。SASS版本3.0之前的后缀名为.sass&#xff0c;而版本3.0之后的后缀名.scss。两者是有不同的&#xff0c;继sa…

This subject is anonymous - it does not have any identifying principals and authorization operations

大家好&#xff0c;我是烤鸭&#xff1a; 最近使用shiro&#xff0c;遇到如下问题&#xff1a; 严重: Servlet.service() for servlet [dispatcherServlet] in context with path [/etc] threw exception [Request processing failed; nested exception is org.apache.shiro.a…

[css] absolute的containing block(容器块)计算方式和正常流有什么区别?

[css] absolute的containing block&#xff08;容器块&#xff09;计算方式和正常流有什么区别&#xff1f; absolute会先向上找到第一个position不为static或者fixed的祖先元素&#xff0c;然后根据该祖先元素的display属性分类讨论。 如果为块级元素&#xff0c;则为该块级元…

PC网页js调用本地应用程序

最近要现实一个在PC网页中实现点击按钮调用本地应用程序的功能 其实实现原理也非常简单&#xff0c; 首先注册一个本地注册表文件&#xff0c;指向本地应用程序路径 其次在网页中用js指向这个注册表文件&#xff0c;就可以实现网页调用本地应用程序 Windows Registry Editor V…

[css] 说说visibility属性的collapse属性值有什么作用?在不同浏览器下有什么区别?

[css] 说说visibility属性的collapse属性值有什么作用&#xff1f;在不同浏览器下有什么区别&#xff1f; 设置visibility: collapse后对于普通元素来说跟visibility: hidden效果一样&#xff0c;隐藏元素&#xff0c;且占用空间 但对于一些table元素&#xff0c;比如row、col…

springboot 多数据源 读写分离 AOP方式

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享springboot读写分离配置。 环境&#xff1a; springboot 2.1.0.RELEASE 场景说明&#xff0c;目前的需求是 读数据源 * 2 写数据源 * 1 1. 配置文件 application.yml server:port: 8085 spring:application:name: test-d…

强大的jQuery图片查看器插件Viewer.js

简介 Viewer.js 是一款强大的图片查看器 Viewer.js 有以下特点&#xff1a;支持移动设备触摸事件支持响应式支持放大/缩小支持旋转&#xff08;类似微博的图片旋转&#xff09;支持水平/垂直翻转支持图片移动支持键盘支持全屏幻灯片模式&#xff08;可做屏保&#xff09;支持缩…