前言 关于时间
数据库优化,最重要的目标是时间,最大的敌人也是时间。
套用经济学的概念,数据库优化就像一辆三驾马车,而它的三匹马分别是查询优化、索引优化、库表结构优化。要获取最佳的数据库性能需要三匹马齐头并进、一个不落。
1. 为什么查询速度会慢
查询会在不同的地方花费时间,包括网络、CPU计算、生成统计及信息和执行计划、锁等待(互斥等待)等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU操作和内存不足时导致的I/O操作上消耗时间。可能会产生大量的上下文切换以及系统调用。
不必要的额外操作、某些操作被额外地重复了很多次、某次操作执行得太慢等。优化查询的目的就是减少和消除这些操作花费时间。
2. 慢查询基础:优化数据访问
基础:大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。
有效的两步:
- 确认application是否在检索大量超过需要的数据
- 确认MySQL server是否在分析大量超过需要的数据行
2.1 是否向数据库请求了不需要的数据
错误案例,尽量避免
查询不需要的记录
Mysql会先返回全部结果集再进行计算
多表关联时返回全部列
总是取出全部列
(想起了索引作业返回所有列)取出全部列,会让优化器无法完成索引覆盖扫描这类优化!还会为服务器带来额外的I/O、内存、CPU的消耗。
注:虽然会浪费数据库资源,但有时候可以简化开发,提高代码复用性。但要注意使用缓存机制。
重复查询相同的数据。
注意利用缓存。(查询缓存之后之后要看看)
2.2 MySQL是否在扫描额外的记录
简单的衡量查询开销的三个指标
响应时间
包括服务时间、排队时间之和。
- 服务时间——数据库处理这个查询真正花了多长时间
- 排队时间——服务器因为等待某些资源而没有真正执行查询的时间——可能等I/O操作完成,也可能是等待行锁等。
扫描的行数和返回的行数
查看查询扫描的行数是非常有帮助的,在一定程度能够说明该查询找到需要的数据的效率高不高。