如何定位並優化慢查詢SQL
- 根據慢日誌定位慢查詢sql
慢日誌:用來記錄執行比較慢的sql
與慢日誌有關的三個變量:
- slow_query_log 標記慢日誌的開啓和關閉
- slow_query_log_file 標記慢日誌的存儲位置
- long_query_time 當sql執行時間超過這個時間就會被記錄到慢日誌
- Slow_queries 記錄當前慢查詢得到數量,重啓數據庫後自動清0
#開啓慢查詢
set global slow_query_log = on;
#設置慢查詢時間
set global long_query_time = 1;
#但是需要注意,這種修改在重新連接數據庫後設置就會失效,想要永久生效應該去配置文件中修改
- 使用explain等工具分析sql
explain可以幫助我們分析查詢效率低下的原因
用法,直接在對應查詢語句前面加上explain
explain中的關鍵字段:
- type (若值爲index或者all表明本次查詢走得是全表掃描,需要優化)
- extra(可以獲取一些信息,輔助瞭解語句的執行方式)
當extra中出現以下兩項意味着MySQL根本不能使用索引,效率會受到很大影響:
extra項 | 說明 |
---|---|
Using filesort | 表示MySQL會對結果使用一個外部索引排序,而不是從表裏按照索引次序讀取到相關內容,可能在內存或磁盤上進行排序。MySQL中無法利用索引完成的排序操作稱爲“文件排序” |
Using temporary | 表示MySQL在對查詢結果排序時使用臨時表。常見於排序Order By和分組查詢Group by |
- 修改sql或者儘量讓sql走索引(可以添加新索引)
#強制讓SELECT走主鍵索引,通過FORCEC INDEX可以對比各個索引執行時間進行優化
SELECT count(id) FROM user FORCE INDEX(primary);
SQL重點語法
- GROUP BY
- 要滿足 “SELECT子句中的列名必須爲分組列或列函數”,也就是說SELECT中若進行分組,其選出的結果應該爲被分組的列或者是帶有sum(),min()等列函數的列。(該條件只針對同一張表成立)
- 列函數對於GROUP BY子句定義的每個組各返回一個結果
- WHRER一定要寫在GROUP BY的前面
- HAVING
- 通產與GROUP BY子句一同使用
- WHERE過濾行,HAVING過濾組
- 出現在同一sql的順序:WHERE > GROUP BY > HAVING(調換位置會報錯)
a. 執行where子句查找符合條件的數據
b. 使用group by 子句對數據進行分組
c. 對group by 子句形成的組運行聚集函數計算每一組的值
d. 最後用having 子句去掉不符合條件的組
- 在使用HAVING時,如果省略了GROUP BY子句,那麼HAVING此時等同於WHERE
MySQL中的五大約束
- 主鍵約束(Primay Key Coustraint) 唯一性,非空性
- 唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個
- 檢查約束 (Check Counstraint) 對該列數據的範圍、格式的限制
- 默認約束 (Default Counstraint) 該數據的默認值
- 外鍵約束 (Foreign Key Counstraint) 需要建立兩表間的關係並引用主表的列
其他知識點補充
- 通過limit進行分頁查詢(用法可以自行Google)
- 主鍵自增長設置方式:auto_increment
- ORDER BY的工作方式 :
直接空降鏈接:https://www.cnblogs.com/lamp01/p/10770172.html
這位大哥可以說是在他的博客寫得非常詳盡了,對於底層得工作流程,以及聯合索引等知識都有介紹