MySQL优化查询性能
2018-01-03| 程成| 1002| 0| MySQL

查询优化、索引优化、库表结构优化需要齐头并进,一个不落。在获得编写 MySQL 查询的经验的同时,也将学习到如何为高效的查询设计表和索引。同样的,也可以学习到在优化库表结构时会影响到哪些类型的查询。这个过程需要时间。


一、为什么查询速度会慢


MySQL 在执行查询的时候,“执行”过程可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。


在完成这些任务的时候,查询需要在不同的地方话费时间,包括网络,CPU 计算,生成统计信息和执行计划、锁等待(互斥等待)等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU 操作和内存不足时导致的 I/O 操作上消耗时间。根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用。


在每一个消耗大量时间的查询案例中,我们都能看到一些不必要的额外操作、某些操作被额外的重复了很多次、某些操作执行的太慢等。优化查询的目的就是减少和消除这些操作所花费的时间。



二、慢查询基础:优化数据访问


查询性能低下最基本的原因是访问的数据太多。某些查询可能不可避免的需要筛选大量数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。对于低效的查询,我们发现通过下面两个步骤来分析总是很有效:


1、确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,但有时候也可能是访问了太多的列。

2、确认 MySQL 服务器层时候在分析大量超过需要的数据行。



三、重构查询的方式


在优化有问题的查询时,目标应该是找到一个更优的方法获得实际需要的结果---而不一定总是需要从 MySQL 获取一模一样的结果集。有时候,可以将查询转换一种写法让其返回一样的结果,但是性能更好。但也可以通过修改应用代码,用另一种方式完成查询,最终达到一样的目的。



四、总结


除了这些基础的手段,包括查询、表结构、索引等,MySQL 还有一些高级的特性可以帮助你优化应用,例如分区,分区和索引有些类似但是原理不同。MySQL 还支持查询缓存,它可以帮你缓存查询结果,当完全相同的查询再次执行时,直接使用缓存结果。




×
作者:程成
QQ:492245711