查询性能优化

数据库的优化主要包括:索引优化,查询优化,库表结构优化

1. 低效查询的步骤
1. 是否向数据库请求了不需要的数据(检查应用程序是否检索了大量不超过需要的数据行(或者列)【是否是where条件不具体导致的?】)
1.响应时间 2扫描行数 3返回行数 可以作为衡量标准
2. 是否在分析大量超过需要的数据行

  1. 一个复杂查询还是多个简单查询
    之前认为数据库层完成尽可能多的任务,因为解析 查询 和优化是代价很高的事情
    但是现阶段而言 MySQL内存中每秒能扫描上百万行的数据, 影响查询效率的地方是数据响应客户端。在其他条件相同的条件下尽可能少的查询是好的,但是有时候
    分割成小的查询也是非常必要的。
  1. 切分查询
    如果要删删除一个很大的数据的话。一下删除是不明智的因为他会一次锁住很多数据,耗尽系统资源, 导致阻塞其他查询。这是后需要分割。分多次 去删除(10000行比较高效对服务器
    影响小的)
  2. 分解关联查询
  3. 数据库查询过程
  1. 客户端向MySQL服务器发送一个请求
  2. 服务器查询缓存 如果有缓存则立即返回结果
  3. 如果没有缓存则会进行SQL语句解析,预处理 然后查询优化器生成执行任务
  4. mysql 根据执行任务调用存储引擎API来执行查询
  5. 结果返回客户端
  1. MySQL 客户端和服务器通信协议
  1. 服务器和客户端数据交互是半双工的。任何一个时刻 客户端要么是向服务端发送数据,或者是服务端向客户端发送数据。而不能同时进行。也不能将一个消息分割成独立的小块进行发送(抛皮球游戏)
  2. 查询状态:对于一个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 操作会更快

  1. 优化特定类型的查询
  1. count:如果统计列字段时非空 则只用count()效率较高,myisam 引擎中如果没有where条件则count()无需计算行数。直接返回数值。(存储引擎特性有关)。如果有where那么其他引擎没有任何不同