《打造扛得住的MySQL数据库架构》第7章 SQL查询优化
SQL查询优化
7-1 获取有性能问题SQL的三种方法
- 如何设计最优的数据库表结构
- 如何建立最好的索引
- 如何拓展数据库的查询
查询优化,索引优化,库表结构优化
如何获取有性能问题的SQL
1、通过测试反馈获取存在性能问题的SQL
2、通过慢查日志获取存在性能问题的SQL
3、实时获取存在性能问题的SQL
7-2 慢查询日志介绍
存储日志所需要的大量的磁盘空间
- slow_query_log 启动停止记录慢查询日志,默认为关闭
如果希望在已经运行的MySQL上on此功能可通过set global启动功能。
通过脚本来定时的开关慢查日志。
- slow_query_log_file 指定慢查日志的存储路径及文件,默认保存在MySQL的数据目录中。
建议日志存储和数据存储分开存储
- long_query_time 指定记录慢查询日志SQL执行时间的阈值,参数单位是S
记录符合条件的查询语句和数据修改语句,包括已经回滚的SQL
通常改为0.001秒也就是1毫秒可能比较合适
- log_queries_not_using_indexes 是否记录未使用索引的SQL
即便在时间的阈值内没用索引的SQL依旧会被日志记录
慢查日志中记录的内容
使用慢查询日志分析工具获取有性能问题的SQL
mysqldumpslow
汇总除查询条件外其它完全相同的SQL,
并将分析结果按照参数中所指定的顺序输出。
mysqldumpslow -s r -t 10 slow-mysql.log
7-3 慢查询日志实例
常用的慢查日志分析工具(pt-query-digest)
pt-query-digest
--explain h=127.0.0.1,u=root,p=p@ssW0rd
slow-mysql.log
7-4 实时获取性能问题SQL
如何实时获取mysql有性能问题的SQL
写脚本周期性执行查询命令
7-5 SQL的解析预处理及生成执行计划
mysql服务器处理查询请求的整个过程
- 客户端发送SQL请求给服务器
- 服务器检查是否可以在查询缓存中命中该SQL
- 服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划
- 根据执行计划,调用存储引擎API来查询数据
- 将结果返回给客户端
查询缓存对SQL性能的影响
query_cache_type 设置查询缓存是否可用 off
DEMAND表示只有在查询语句中使用SQL_CACHE和SQL_NO_CACHE来控制是否需要缓存
query_cache_size 设置查询缓存的内存大小 0
query_cache_limit 设置查询缓存可用存储的最大值
query_cache_wlock_invalidate 设置数据表被锁后是否返回缓存中的数据
query_cache_min_res_unit 设置查询缓存分配的内存块最小单位
Hash查找只能进行全值匹配,从查询缓存中直接返回结果,概率上并不容易。
对于一个读写频繁的系统使用查询缓存,可能会降低查询处理的效率。
MySQL依照这个执行计划和存储引擎进行交互,这个阶段包括了多个子过程:
语法解析阶段是通过关键字对MySQL语句进行解析,并生成一棵对应的“解析树”
包括检查语法是否使用了正确的关键字,关键字的顺序是否正确等。
预处理阶段检查查询中所涉及的表和数据列是否存在及名字或别名是否存在歧义等等
语法检查全都通过了,查询优化器就可以生成查询计划了。
会造成MySQL生成错误的执行计划的原因
- 统计信息不准确
- 执行计划中的成本估算不等同于实际的执行计划的成本
- MySQL从不考虑其他并发的查询,这可能会影响当前查询的速度
- MySQL有时候也会基于一些固定的规则来生成执行计划
- MySQL不会考虑不受其控制的成本
MySQL优化器可优化的SQL类型
- 重新定义表的关联顺序
- 将外连接转化成内连接
- 使用等价变化规则
- 优化count()、min()和max()
- 将一个表达式转化为常数表达式
- 子查询转换为关联查询
- 提前终止查询 limit 10
- 对in()条件进行优化
7-6 如何确定查询处理各个阶段所消耗的时间
如何确定查询处理各个阶段所消耗的时间
mysql5.7版本,使用performance_schema
use performance_schema;
update setup_instruments set enabled ='YES',timed='yes' where name like 'stage%';
update setup_consumers set enabled ='YES' where name like 'events%';
执行被全局监控的SQL查询语句;
7-7 特定SQL的查询优化
如何获取一个存在性能问题的SQL
如何度量一个SQL在执行的各个阶段所消耗的时间
大表的数据修改最好要分批处理
1000万行记录的表中删除/更新100万行记录,一次只删除/更新5000行记录
暂停几秒,缓解主从集群下复制同步的压力
如何修改大表的表结构
- 对表中的列的字段类型进行修改
- 改变字段的宽度时还是会锁表
- 无法解决主从数据库延迟的问题
pt-online-schema-change
--alter="MODIFY c VARCHAR(150) NOT NULL DEFAULT '' "
--user=root --password=PassWord D=imooc,t=sbtest4
--charset=utf8 --execute
如何优化not in 和<>查询
使用汇总表优化查询
汇总表就是提前把要统计的数据进行汇总并记录到表中,
以备后续的查询使用。
《打造扛得住的MySQL数据库架构》第7章 SQL查询优化的更多相关文章
- 《打造扛得住的MySQL数据库架构》第4章 MySQL数据库结构优化
4-1 数据库结构优化介绍 良好的数据库逻辑设计和物理设计是数据库获得高性能的基础. 1.减少不必要的数据冗余. 2.尽量避免数据维护中出现更新,插入和删除异常. 插入异常:如果表中的某个实体随着另一 ...
- 《打造扛得住的MySQL数据库架构》第3章 MySQL基准测试
3-1 什么是基准测试 测量系统性能,优化是否有效?MySQL基准测试. 定义:基准测试是一种测量和评估软件性能指标的活动,用于建立某个时刻的性能基准,以便当系统发生软硬件 变化时重新进行基准测试以评 ...
- MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段
--查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...
- mysql数据库架构设计与优化
mysql数据库架构设计与优化 2019-04-23 20:51:20 无畏D尘埃 阅读数 179 收藏 更多 分类专栏: MySQL 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...
- Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)
什么是基准测试 基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响. 我们可以这样认为:基准测试是针对系统设置的一 ...
- mysql数据库性能优化(包括SQL,表结构,索引,缓存)
优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...
- 步步深入MySQL:架构->查询执行流程->SQL解析顺序!
一.前言 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序 ...
- linux下 mysql数据库的备份和还原sql
1.备份 [root@CentOS ~]# mysqldump -u root -p mysql > ~/mysql.sql #把数据库mysql备份到家目录下命名为mysql.sql Ente ...
- MySql数据库时区异常,java.sql.SQLException: The server time zone value '?й???׼ʱ?' is unrecognized or represents more than one time zone.
JDBC访问MySql异常 Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException ...
随机推荐
- windows制作动态链接库和使用一
制作: //myDll.h _declspec(dllexport) int add(int a,int b); _declspec(dllexport) int sub(int a,int b); ...
- ssh与scp
ssh命令用于linux 的远程登录,其默认端口为:22,在工作中常常会修改掉这一默认端口的值. scp命令用于远程的文件相互拷贝. scp远程文件拷贝: [root@jerry a]#ls ...
- imp.load_source的用法
imp.load_source(name,pathname[,file])的作用把源文件pathname导入到name模块中,name可以是自定义的名字或者内置的模块名称. 假设在路径E:/Code/ ...
- 009-PHP循环输出数组成员
<?php $Cities[] = "<B>北京</B>"; //等同于$Cities[0] = "北京" $Cities[] = ...
- Java 定时循环运行程序
Timer 和 ScheduledExecutorSeruvce 都能执行定时的循环任务,有函数 scheduleAtFixedRate.但是,如果任务运行时间较长,超过了一个周期时长,下一个任务就会 ...
- 谈谈对MapTask任务分配和Shuffle的理解
一.切片与MapTask的关系 1.概述 大家要注意区分切片与切块的区别: 切块Block是HDFS物理上把数据分成一块一块的,默认是128M: 数据切片:只是在逻辑上对输入进行分片,并不会在磁盘上分 ...
- 四、Vue过渡与动画、过渡css类名、自定义指定、过滤器
一.过渡 动画 1.1简单的过渡动画使用 parent.vue [0]定义一个待显示的数据 [1]定义一个显示隐藏flag [2]使用动画过滤标签,name用来连接style样式:v-show用来控制 ...
- C#常用类库简介(二)
原文出处:http://blog.csdn.net/weiwenhp/article/details/8140503 C#常用类库简介(一)的地址 System与mscorlib这两个dll中的类库是 ...
- UVA - 122 Trees on the level (二叉树的层次遍历)
题意:给定结点值和从根结点到该结点的路径,若根到某个叶结点路径上有的结点输入中未给出或给出超过一次,则not complete,否则层次遍历输出所有结点. 分析:先建树,建树的过程中,沿途结点都申请了 ...
- SQL语句中为什么要用 where 1=1
where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句,1=1 是永恒成立的,意思无条件的,也就是说在SQL语句中有没有这个1=1都可以. 如:web界面查 ...