导致慢查询的原因
- 向数据库请求了不需要的数据
a、 查询不需要的记录
b、 多表关联时返回全部列
c、 总是取出全部列
d、 重复查询相同的数据 - mysql是否在扫描额外的记录
优化技巧:
a、使用索引覆盖扫描,把所有需要用到的列都放到索引中
b、改变库表结构,比如建立汇总表。
c、重写查询 - 重构查询的方式
a、 将复杂查询分成多个简单查询
b、 切分查询
c、 分解关联查询。优势:让缓存的效率更高。减少锁的竞争。在应用层扩展,可以更容易的对数据库拆分,更容易做到高性能和可扩展。查询本身效率也会提高。可以减少冗余记录的查询。
查询执行路径
1、客户端发送一条查询给服务器。
2、先从查询缓存中查找,如果找到直接返回,没找到进入下一阶段
3、服务器端进行SQL解析,预处理、查询优化、然后生成执行计划
4、mysql根据执行计划调用存储引擎的API来执行查询。
5、将结果返回给客户端。
通信协议
Mysql客户端和服务器的通信属于半双工。既同一时刻只能发或者收,不能同时收发数据。客户端发出查询后,服务器会将所有返回数据分成多个包返回,直到所有数据都返回完毕,否则任何一方都不能终止。
IN()
在mysql中IN()和OR()并不等价,这是因为mysql会将IN列表中的数据进行排序,然后按照二分查找的方式来确定列表中的值是否满足条件,时间复杂度为logn,而OR()的查询复杂度为n,对于IN列表中有大量取值的时候,MYSQL处理速度会比较快。