MySQL數據庫學習(三)----慢查詢調優sql + 重要語法羅列 + 其它知識點

如何定位並優化慢查詢SQL

  1. 根據慢日誌定位慢查詢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;
#但是需要注意,這種修改在重新連接數據庫後設置就會失效,想要永久生效應該去配置文件中修改
  1. 使用explain等工具分析sql

explain可以幫助我們分析查詢效率低下的原因

用法,直接在對應查詢語句前面加上explain

explain中的關鍵字段:

  • type (若值爲index或者all表明本次查詢走得是全表掃描,需要優化)
    在這裏插入圖片描述- extra(可以獲取一些信息,輔助瞭解語句的執行方式)
    當extra中出現以下兩項意味着MySQL根本不能使用索引,效率會受到很大影響:
extra項 說明
Using filesort 表示MySQL會對結果使用一個外部索引排序,而不是從表裏按照索引次序讀取到相關內容,可能在內存或磁盤上進行排序。MySQL中無法利用索引完成的排序操作稱爲“文件排序”
Using temporary 表示MySQL在對查詢結果排序時使用臨時表。常見於排序Order By和分組查詢Group by
  1. 修改sql或者儘量讓sql走索引(可以添加新索引)
#強制讓SELECT走主鍵索引,通過FORCEC INDEX可以對比各個索引執行時間進行優化
SELECT count(id) FROM user FORCE INDEX(primary);

SQL重點語法

  1. GROUP BY
  • 要滿足 “SELECT子句中的列名必須爲分組列或列函數”,也就是說SELECT中若進行分組,其選出的結果應該爲被分組的列或者是帶有sum(),min()等列函數的列。(該條件只針對同一張表成立)
  • 列函數對於GROUP BY子句定義的每個組各返回一個結果
  • WHRER一定要寫在GROUP BY的前面
  1. 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
    這位大哥可以說是在他的博客寫得非常詳盡了,對於底層得工作流程,以及聯合索引等知識都有介紹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章