面试题|MySQL高性能实战——part5——查询性能优化

【面试题|MySQL高性能实战——part5——查询性能优化】前言:
此文借鉴《MySQL高性能》一书,还有MySQL官方文档,笔者将通过自身的一些实战经验和阅读习惯对本书进行一个总结,整理,归纳出企业级开发中常用的优化案列和部分概念!!
?
官方文档地址:
https://dev.mysql.com/doc/refman/5.7/en/
?
本文:由于数据库知识庞大且复杂,笔者将以,以下几个模块进行拆分解读,请大家按需自取!!!

  1. MySQL高性能实战——part1——MySQL架构与历史
  2. MySQL高性能实战——part2——Schema和数据类型优化
  3. MySQL高性能实战——part3——分析SQL,定位慢SQL(性能优化的前提)
  4. MySQL高性能实战——part4——高性能索引使用
  5. MySQL高性能实战——part5——查询性能优化
  6. MySQL主从复制与读写分离,分库分表
?
?
?
版本说明:
不同数据库版本可能对SQL的执行以及部分特性产生巨大的影响,所以在这里明确一下版本
参考书籍版本:5.1或5.5
实战案列实际使用版本:5.7
?

MySQL高性能实战——part5——查询性能优化 还没写完,后面持续更新
前言 前面的章节我们介绍了如何设计最优的库表结构、如何建立最好的索引,这些对于高性能来说是必不可少的。但这些还不够—还需要合理的设计查询。如果查询写得很糟糕,即使库表结构再合理、索引再合适,也无法实现高性能。
?
査询优化、索引优化、库表结构优化需要齐头并进,一个不落。在获得编写 MySQL査询的经验的同时,也将学习到如何为高效的查询设计表和索引。同样的,也可以学习到在优化库表结构时会影响到哪些类型的查询。
?
本章将从查询设计的一些基本原则开始——这也是在发现查询效率不高的时候首先需要考虑的因素。然后会介绍一些更深的查询优化的技巧,并会介绍一些 MySQL优化器内部的机制。将展示 MySQL是如何执行查询的,你也将学会如何去改变一个查询的执行计划。最后,我们要看一下 MySQL优化器在哪些方面做得还不够,并探索查询优化的模式,以帮助 MySQL更有效地执行查询。
本章的目标是帮助大家更深刻地理解 MySQL如何真正地执行查询,并明白高效和低效的原因何在,这样才能充分发挥 MySQL的优势,并避开它的弱点。
?
?

1.为什么查询速度会慢 在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间。如果把查询看作是个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快.
?
通常来说查询的生命周期大致可以按照顺序来看:
  1. 从客户端
  2. 到服务器
  3. 然后在服务器上进行解析
  4. 生成执行计划
  5. 执行
    1. 可以认为是整个生命周期中最重要的阶段
    2. 这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等

在完成这些任务的时候,查询需要在不同的地方花费时间包括:
  1. 网络
  2. CPU计算
  3. 生成统计信息
  4. 执行计划锁等待(互斥等待)等操作
  5. 尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU操作和内存不足时导致的IO操作上消耗时间
根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用**。在毎一个消耗大量时间的査询案例中,我们都能看到一些不必要的额外操作、某些操作被额外地重复了很多次、某些操作执行得太慢等。优化查询的目的就是减少和消除这些操作所花费的时间。**
再次申明一点,对于一个查询的全部生命周期,上面列的并不完整。这里只是想说明了解查询的生命周期、清楚查询的时间消耗情况对于优化査询有很大的意义。有了这些概念,我们再一起来看看如何优化查询。

    推荐阅读