高性能MySQL读书笔记---查询优化

查询优化

  1. 查询缓慢的缘由redis

    • 是否向数据库请求了没必要要的数据
      1.查询时是否返回了所有或者大部分数据而后再进行处理的。
      2.进行单查或者多表联查时是否返回了所有列数据。例如:数据库

      SELECT * FORM table1 WHERE a=1;
          SELECT * FORM table1 LEFT JOIN table2 LEFT JOIN table2 where a = b;

      查询时尽可能只查本身须要的字段,尽可能不要用*查询
      查询400万数据,十个字段时直接使用*查询耗费时间为11s,只查询id时耗费3s左右缓存

      clipboard.png

      clipboard.png

      1. 查询单条数据肯定行时尽可能使用LINIT来限制查询行数,终止查询,不然就算找到对应列后MsSQL仍是继续扫描
        不加索引的状况下,查询单条数据不加limit 2.5s 加上limit限制0.1s

    clipboard.png

clipboard.png

  1. 拆分复杂的查询方式网络

    • 将一个复杂的查询拆分红多个简单的查询。
    • 将一次处理大量数据的操做,分解为多个小操做。循环的方式每次处理一部分数据。一次删除不要超过10 000行(delete)
    • 减小JOIN的使用,把多表联查的查询分解成多个单表查询,在应用程序中实现链接操做
      拆分查询的优点:
    1. 能更有效的利用MySQL缓存
    2. 能够有效的利用表锁,查询会锁住单个表较短期。
    3. 客户端能够方便拆分数据库和拆分表,作分布式数据库。
    4. MySQL解析器解析SQL更迅速,查询更高效
    5. 能够更好的利用索引
    6. 减小对多余数据的访问,减小内存和网络的开销
  2. 减小对COUNT的使用,由于InnoDB使用COUNT是作的全表扫描,对大表使用COUNT查询会很是缓慢分布式

    • 对于须要统计的数据冗余的统计表来作统计操做,一个小时或者一天统计一次数据
    • 使用Redis之类的缓存技术来作统计功能,例如排行榜和点赞人数统计能够用redis的有序集合来作
  3. 减小min,max的使用,由于也会扫描整个表,若须要统计尽可能使用缓存来作
  4. 使用order by group by 时,尽可能确保只引用表中的一列,多了会使用不到索引。尽可能减小在数据库中进行排序操做
相关文章
相关标签/搜索