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服务器处理查询请求的整个过程

  1. 客户端发送SQL请求给服务器
  2. 服务器检查是否可以在查询缓存中命中该SQL
  3. 服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划
  4. 根据执行计划,调用存储引擎API来查询数据
  5. 将结果返回给客户端

查询缓存对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查询优化的更多相关文章

  1. 《打造扛得住的MySQL数据库架构》第4章 MySQL数据库结构优化

    4-1 数据库结构优化介绍 良好的数据库逻辑设计和物理设计是数据库获得高性能的基础. 1.减少不必要的数据冗余. 2.尽量避免数据维护中出现更新,插入和删除异常. 插入异常:如果表中的某个实体随着另一 ...

  2. 《打造扛得住的MySQL数据库架构》第3章 MySQL基准测试

    3-1 什么是基准测试 测量系统性能,优化是否有效?MySQL基准测试. 定义:基准测试是一种测量和评估软件性能指标的活动,用于建立某个时刻的性能基准,以便当系统发生软硬件 变化时重新进行基准测试以评 ...

  3. MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段

    --查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...

  4. mysql数据库架构设计与优化

    mysql数据库架构设计与优化 2019-04-23 20:51:20 无畏D尘埃 阅读数 179  收藏 更多 分类专栏: MySQL   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  5. Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)

    什么是基准测试 基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响. 我们可以这样认为:基准测试是针对系统设置的一 ...

  6. mysql数据库性能优化(包括SQL,表结构,索引,缓存)

    优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...

  7. 步步深入MySQL:架构->查询执行流程->SQL解析顺序!

    一.前言 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序 ...

  8. linux下 mysql数据库的备份和还原sql

    1.备份 [root@CentOS ~]# mysqldump -u root -p mysql > ~/mysql.sql #把数据库mysql备份到家目录下命名为mysql.sql Ente ...

  9. 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 ...

随机推荐

  1. P1074 宇宙无敌加法器

    P1074 宇宙无敌加法器 转跳点:

  2. CodeForces - 876C Classroom Watch (枚举)

    题意:已知n,问满足条件"x的各个数字之和+x=n"的x有几个并按升序输出. 分析: 1.n最大1e9,10位数,假设每一位都为9的话,可知x的各个数字之和最大可以贡献90. 2. ...

  3. 51nod 1416:两点 深搜

    1416 两点 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 福克斯在玩一款手机解迷游戏,这个游戏叫做" ...

  4. install正常,deploy上传jar失败致使打包失败

    [INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------- ...

  5. Program-Language

    1. 主流编程语言 2. 编程语言分类     2.1 编译or解释     2.2 按照客观系统的描述可分为两类     2.3 按照编程范型可分为 3. 语言范式 Paradigm 4. 计算机语 ...

  6. SqlServer查看锁表与解锁

    某些情况下,sqlserver的表会被锁住,比如某个会话窗口有数据一直没提交,窗口又没关闭,这时表就会被锁住 其他任何连接查询表数据时都不会返回 这时需要手工杀掉产生死锁的会话ID,才能恢复正常 查看 ...

  7. spring#事件发布订阅

    1. 如果在应用中发生了某些事件,事件会被拦截和处理就好了,这样就有了很大的灵活性,至少代码不会紧密的耦合在一起, 代码的解耦就是业务的解耦,业务A的代码不用手动的调用业务B的代码,业务B只需要监听相 ...

  8. 一个自己实现的Vector 完善版本

    一个自己实现的Vector(只能处理基本类型数据) 转载自: https://www.ev0l.art/index.php/archives/22/ string 类型不行 bool char* in ...

  9. CSU 1216 异或最大值

    求n个数里面,求两两异或的最大值 直接来肯定会超时 既然要异或最大值,那么两个数的二进制肯定是正好错开为好...为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面 ...

  10. MyBatis 逆向工程(MyBatis 自动生成接口以及xml)的使用

    刚学MyBatis逆向工程(还以为要反汇编呢.....) MyBatis逆向工程 个人理解就是链接数据库自动生成相关的增删改查相关的类 以及xml文件 (其中有一些不足 应该就是多表链接的问题需要自己 ...