高性能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 時,儘可能確保只引用表中的一列,多了會使用不到索引。儘可能減小在數據庫中進行排序操做
相關文章
相關標籤/搜索