MySQL 的 LIMIT 查詢優化

原文地址(沒有進行嚴格的翻譯) https://dev.mysql.com/doc/ref...html

當查詢語句中存在 LIMIT N 同時沒有 HAVING 子句時,MySQL 可能會作下面的優化:mysql

  1. 若是 N 不多,那麼 MySQL 一般更有可能作全表掃描,而不是走索引。
  2. 若是 LIMIT NORDER BY 組合起來用,那麼 MySQL 不會對整個查詢結果集排序,而是在找到知足條件的 N 條記錄後就中止對剩餘的記錄排序。若是排序是經過索引來進行的話,這會很是快。不然的話,若是出現 filesort 的情形,那麼全部知足條件的記錄都會被選取參與排序,排序過程依然是找到知足條件的 N 條記錄後中止。
  3. 若是 LIMIT NDISTINCT 組合起來用,那麼 MySQL 會在找到 N 條不重複的結果後中止。
  4. LIMIT NGROUP BY 組合起來用時,若是 MySQL 可以按索引的順序掃描記錄(或者根據索引排序來掃描記錄),那麼在找到 N 條記錄後,MySQL 不會再繼續計算後面的 GROUP BY 結果了。
  5. 若是 SQL 中沒有加上 SQL_CALC_FOUND_ROWS 限制,那麼 MySQL 在掃描到 N 條知足條件的記錄後就會終止查詢。
  6. LIMIT 0 會立刻返回一個空結果。這個作法能夠用來:1)檢查查詢語句的合法性;2)不執行查詢的前提下得到查詢結果的字段屬性。
  7. 若是 LIMIT NORDER BY 組合起來用可是後者沒有用到索引,那麼 MySQL 有可能依靠內存中 filesort 操做來避免文件合併。
  8. 注意:在包含 ORDER BY 的查詢語句中,有沒有 LIMIT N 會致使返回結果的順序存在差別,雖然兩種狀況下返回的結果順序必定會遵照 ORDER BY 的規則。
相關文章
相關標籤/搜索