前言:
此文借鉴《MySQL高性能》一书,还有MySQL官方文档,笔者将通过自身的一些实战经验和阅读习惯对本书进行一个总结,整理,归纳出企业级开发中常用的优化案列和部分概念!!
官方文档地址:
https://dev.mysql.com/doc/refman/5.7/en/
本文:由于数据库知识庞大且复杂,笔者将以,以下几个模块进行拆分解读,请大家按需自取!!!
版本说明:
不同数据库版本可能对SQL的执行以及部分特性产生巨大的影响,所以在这里明确一下版本
参考书籍版本:5.1或5.5
实战案列实际使用版本:5.7
还没写完,后面持续更新
前面的章节我们介绍了如何设计最优的库表结构、如何建立最好的索引,这些对于高性能来说是必不可少的。但这些还不够—还需要合理的设计查询。如果查询写得很糟糕,即使库表结构再合理、索引再合适,也无法实现高性能。
査询优化、索引优化、库表结构优化需要齐头并进,一个不落。在获得编写 MySQL査询的经验的同时,也将学习到如何为高效的查询设计表和索引。同样的,也可以学习到在优化库表结构时会影响到哪些类型的查询。
本章将从查询设计的一些基本原则开始——这也是在发现查询效率不高的时候首先需要考虑的因素。然后会介绍一些更深的查询优化的技巧,并会介绍一些 MySQL优化器内部的机制。将展示 MySQL是如何执行查询的,你也将学会如何去改变一个查询的执行计划。最后,我们要看一下 MySQL优化器在哪些方面做得还不够,并探索查询优化的模式,以帮助 MySQL更有效地执行查询。
本章的目标是帮助大家更深刻地理解 MySQL如何真正地执行查询,并明白高效和低效的原因何在,这样才能充分发挥 MySQL的优势,并避开它的弱点。
在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间。如果把查询看作是个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快.
通常来说查询的生命周期大致可以按照顺序来看:
在完成这些任务的时候,查询需要在不同的地方花费时间包括:
根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用**。在毎一个消耗大量时间的査询案例中,我们都能看到一些不必要的额外操作、某些操作被额外地重复了很多次、某些操作执行得太慢等。优化查询的目的就是减少和消除这些操作所花费的时间。**
再次申明一点,对于一个查询的全部生命周期,上面列的并不完整。这里只是想说明了解查询的生命周期、清楚查询的时间消耗情况对于优化査询有很大的意义。有了这些概念,我们再一起来看看如何优化查询。