查询性能优化
数据库的优化主要包括:索引优化,查询优化,库表结构优化
1. 低效查询的步骤
1. 是否向数据库请求了不需要的数据(检查应用程序是否检索了大量不超过需要的数据行(或者列)【是否是where条件不具体导致的?】)
1.响应时间 2扫描行数 3返回行数 可以作为衡量标准
2. 是否在分析大量超过需要的数据行
- 一个复杂查询还是多个简单查询
之前认为数据库层完成尽可能多的任务,因为解析 查询 和优化是代价很高的事情
但是现阶段而言 MySQL内存中每秒能扫描上百万行的数据, 影响查询效率的地方是数据响应客户端。在其他条件相同的条件下尽可能少的查询是好的,但是有时候
分割成小的查询也是非常必要的。
- 切分查询
如果要删删除一个很大的数据的话。一下删除是不明智的因为他会一次锁住很多数据,耗尽系统资源, 导致阻塞其他查询。这是后需要分割。分多次 去删除(10000行比较高效对服务器
影响小的) - 分解关联查询
- 数据库查询过程
- 客户端向MySQL服务器发送一个请求
- 服务器查询缓存 如果有缓存则立即返回结果
- 如果没有缓存则会进行SQL语句解析,预处理 然后查询优化器生成执行任务
- mysql 根据执行任务调用存储引擎API来执行查询
- 结果返回客户端
- MySQL 客户端和服务器通信协议
- 服务器和客户端数据交互是半双工的。任何一个时刻 客户端要么是向服务端发送数据,或者是服务端向客户端发送数据。而不能同时进行。也不能将一个消息分割成独立的小块进行发送(抛皮球游戏)
- 查询状态:对于一个MySQL链接或者一个线程来说。每时每刻都会有一个的状态,该状态表示了MySQL当前在做什么,在一个查询的生命周期中,状态会变化好多次
使用SHOW FULL PROCESSLIST来查看现成的状态
1. sleep:线程正在等待客户端发送新的请求
2. Query:线程正在执行查询或者正在将结果发送给客户端
3. Locked: 在MySQL服务器层,该线程正在等待表锁,(innodb中的行锁并不会出现在状态中,对于MySQL是一个比较典型的状态,在其他没有行锁的引擎中也会出现)
4. analyzing and statistics : 线程正在收集存储引擎的统计信息,并生成查询的执行计划
5. copying to tmp table[On disk]: 线程正在执行查询,并将其结果复制到一个临时表中,这种状态一般要么是GROUP BY 操作 ,要么是文件排序操作,或者是
UNION操作,如果后面还有ON DISK标记,则表示正在讲一个内存临时表放在磁盘上
6. Sorting result :线程正在进行排序操作
7. Sending data: 这表示多种状态,线程可能在多个状态之间传送数据,或者在生成结果集,或者在向客户端发送数据
MySQL中IN会先将数值进行排序然后去用二分法查找去查询满足条件的 这是一个 Log n 复杂度的操作,而OR的操作复杂度为(n),对于IN列表中有大量取值的时候MYsql 操作会更快
- 优化特定类型的查询
- count:如果统计列字段时非空 则只用count()效率较高,myisam 引擎中如果没有where条件则count()无需计算行数。直接返回数值。(存储引擎特性有关)。如果有where那么其他引擎没有任何不同