mysql調優從書寫sql開始

理論知識

  • MySQL 的運行機制
    公眾號:Coding測試

  • Mysql 的SQL關鍵字執行順序

公眾號:Coding測試

1、MySQL 的優化方案有哪些?

  • MySQL 數據庫常見的優化手段分為三個層面:SQL 和索引優化、數據庫結構優化、系統硬件優化等。
    前兩個可以通過日常的書寫sql來實現,養成好的習慣可以事半功倍。

  • SQL 和索引優化習慣準則:

    • 習慣1:我們應該儘可能的使用主鍵查詢,而非其他索引查詢,因為主鍵查詢不會觸發回表查詢,因此節省了一部分時間,變相的提高了查詢的性能。
    • 習慣2:避免在 where 查詢條件中使用 != 或者 <> 操作符,因為這些操作符會導致查詢引擎放棄索引而進行全表掃描。
    • 習慣3:(查詢具體的字段而非全部字段)
      要盡量避免使用 select *,而是查詢需要的字段,這樣可以提升速度,以及減少網絡傳輸的帶寬壓力。
    • 習慣4:(優化子查詢)
      盡量使用 Join 語句來替代子查詢,因為子查詢是嵌套查詢,而嵌套查詢會新創建一張臨時表,而臨時表的創建與銷毀會佔用一定的系統資源以及花費一定的時間,但 Join 語句並不會創建臨時表,因此性能會更高。
    • 習慣5:(注意查詢結果集)
      我們要盡量使用小表驅動大表的方式進行查詢,也就是如果 B 表的數據小於 A 表的數據,那執行的順序就是先查 B 表再查 A 表。
    • 習慣6:(不要在列上進行運算操作)
      不要在列字段上進行算術運算或其他表達式運算,否則可能會導致查詢引擎無法正確使用索引,從而影響了查詢的效率。
    • 習慣7:(適當增加冗餘字段)
      增加冗餘字段可以減少大量的連表查詢,因為多張表的連表查詢性能很低,所有可以適當的增加冗餘字段,以減少多張表的關聯查詢,這是以空間換時間的優化策略。
  • 數據庫結構優化習慣準則

    • 習慣1:(最小數據長度)
      一般說來數據庫的表越小,那麼它的查詢速度就越快,因此為了提高表的效率,應該將表的字段設置的儘可能小,比如身份證號,可以設置為 char(18) 就不要設置為 varchar(18)。

    • 習慣2:(使用最簡單數據類型)
      能使用 int 類型就不要使用 varchar 類型,因為 int 類型比 varchar 類型的查詢效率更高。

    • 習慣3:(盡量少定義 text 類型)
      text 類型的查詢效率很低,如果必須要使用 text 定義字段,可以把此字段分離成子表,需要查詢此字段時使用聯合查詢,這樣可以提高主表的查詢效率。

    • 習慣4:(適當分表、分庫策略)
      分表和分庫方案也是我們經常說的垂直分隔(分表)和水平分隔(分庫)。

2、正確使用聯合索引

使用了 B+ 樹的 MySQL 數據庫引擎,比如 InnoDB 引擎,在每次查詢複合字段時是從左往右匹配數據的,因此在創建聯合索引的時候需要注意索引創建的順序。例如,我們創建了一個聯合索引是 idx(name,age,sex),那麼當我們使用,姓名+年齡+性別、姓名+年齡、姓名等這種最左前綴查詢條件時,就會觸發聯合索引進行查詢;然而如果非最左匹配的查詢條件,例如,性別+姓名這種查詢條件就不會觸發聯合索引。

  • 慢查詢排查
    慢查詢通常的排查手段是先使用慢查詢日誌功能,1.查詢出比較慢的 SQL 語句,2.然後再通過 explain 來查詢 SQL 語句的執行計劃,最後分析並定位出問題的根源,再進行處理。

  • 配置開啟說明(需要注意的是,在開啟慢日誌功能之後,會對 MySQL 的性能造成一定的影響,因此在生產環境中要慎用此功能)
    我們需要配置 my.cnf 中的「slow_query_log=1」即可,並且可以通過設置「slow_query_log_file=/tmp/mysql_slow.log」來配置慢查詢日誌的存儲目錄,但這種方式配置完成之後需要重啟 MySQL 服務器才可生效。

具體查詢可以通過mysql的Explain執行計劃來排查

具體使用詳情見該文章

3、附Explain參數說明

公眾號:Coding測試

以上字段中最重要的就是 type 字段,它的所有值如下所示:

公眾號:Coding測試

特別注意:當 type 為 all 時,則表示全表掃描,因此效率會比較低,此時需要查看一下為什麼會造成此種原因,是沒有創建索引還是索引創建的有問題?以此來優化整個 MySQL 運行的速度。


更多測試技術分享、學習資源以及一些其他福利可關注公眾號:【Coding測試】獲取:
Coding測試