Mysql慢查詢優化

1、打開Mysql的慢查詢日誌:

方式一:修改my.inimysql

//定義多少秒的查詢算是慢查詢,這裏定爲2秒
long_query_time=2

//5.5及以上版本配置以下
slow-query-log=on
slow_query_log_file="mysql_slow_query.log"

//記錄沒有使用索引的query
log-query-not-using-indexes

方式二:控制檯開啓sql

set global slow_query_lon=ON
set global long_query_time=3600
set global log_querise_not_using_indexes=ON

2、使用EXPLAIN分析sql慢查詢語句

上圖爲使用了索引,下圖沒有。數據庫

type從好到壞依次是:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALLbash

  • const:使用惟一索引或者主鍵,返回記錄必定是1行記錄的等值where條件時,一般type是const。其餘數據庫也叫作惟一索引掃描
  • eq_ref:出如今要鏈接過個表的查詢計劃中,驅動表只返回一行數據,且這行數據是第二個表的主鍵或者惟一索引,且必須爲not null,惟一索引和主鍵是多列時,只有全部的列都用做比較時纔會出現eq_ref
  • ref:不像eq_ref那樣要求鏈接順序,也沒有主鍵和惟一索引的要求,只要使用相等條件檢索時就可能出現,常見與輔助索引的等值查找。或者多列主鍵、惟一索引中,使用第一個列以外的列做爲等值查找也會出現,總之,返回數據不惟一的等值查找就可能出現。
  • range:索引範圍掃描,常見於使用>,<,is null,between ,in ,like等運算符的查詢中。
  • index,ALL:至關與全表查詢

阿里規約要求:至少要達到 range 級別,要求是 ref 級別,若是能夠是 consts 最好函數

3、經常使用慢查詢優化

一、索引失效的狀況:post

  • 不在索引列上作任何操做(計算,函數,(自動或者手動)類型裝換),會致使索引失效而致使全表掃描;
  • 使用不等於(!= 或者<>)的時候,沒法使用索引,會致使索引失效
  • 使用is not null 或者 is null會致使沒法使用索引
  • like查詢是以%開頭,索引會失效變成全表掃描,覆蓋索引。
  • 若是條件中有or,即便其中有條件帶索引也不會使用(這也是爲何儘可能少用or的緣由)。要想使用or,又想讓索引生效,只能將or條件中的每一個列都加上索引
  • 若是mysql使用全表掃描要比使用索引快,則不會使用到索引

二、優化數據庫結構優化

分表分庫 spa

三、優化LIMIT分頁.net

當limit m,n的m過大時,致使每次查詢都要先從整個表中找到知足條件 的前M條記錄,以後捨棄這M條記錄並從第M+1條記錄開始再依次找到N條知足條件的記錄。若是表很是大,且篩選字段沒有合適的索引,且M特別大那麼這樣的代價是很是高的。日誌

SELECT * FROM pre_forum_post ORDER BY pid ASC LIMIT 7332000,1000

select a.* from pre_forum_post a ,(select tid,position from pre_forum_post ORDER BY pid ASC LIMIT 7332000,1000) b where a.tid=b.tid and a.position=b.position

https://blog.csdn.net/qq_35513598/article/details/79813098

http://www.javashuo.com/article/p-uenudhjc-hk.html

相關文章
相關標籤/搜索