1. 程式人生 > 其它 >MySql資料庫優化維度

MySql資料庫優化維度

MySql資料庫優化維度

  首先,正常來說一個業務對應的資料,有很多複雜的資料庫操作。不管是剛開始的業務,還是越發複雜的業務,都需要考慮資料庫的設計、效能,並如何去調優。

資料庫設計步驟

選擇合適資料庫

  根據業務需求動向,分析業務資料的處理行為,分成兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)

資料表結構關係設計

  一些比較複雜的大業務,可通過一些方式拆分業務,合理的建立一個業務表之間的關係,以及利用一些技巧提高一些效率。
  1. 表結構要儘量遵循三正規化的原則
  2. 如果分析查詢表比較多,尤其是需要進行多表聯查的時候(儘量減少多表聯查),可以採用反正規化進行優化。反正規化採用空間換時間的方式,通過增加冗餘欄位提高查詢的效率。
  3. 表字段的資料型別選擇,關係到了查詢效率的高低以及儲存空間的大小。一般來說,如果欄位可以採用數值型別就不要採用字元型別;字元長度要儘可能設計得短一些。針對字元型別來說,當確定字元長度固定時,就可以採用 CHAR 型別;當長度不固定時,通常採用 VARCHAR 型別。
  資料表的結構設計很基礎,也很關鍵。好的表結構可以在業務發展和使用者量增加的情況下依然發揮作用,不好的表結構設計會讓資料表變得非常臃腫,查詢效率也會降低。

查詢優化

  看到一個sql的時候,首先需要考慮分析的是sql的業務邏輯是什麼,想要幹什麼。   在上一步設計好業務資料表結構之間的關係,則sql的邏輯將不會複雜,大多都是單表查詢,極個別會聯表查詢。 主要的查詢優化步驟
  1. 只要簡單的看一下Sql語句是否符合規範
  2. 根據資料特性檢視是否需要建立索引,Explain分析一下索引使用情況:MySQL中EXPLAIN執行計劃分析
  3. 分析一下查詢是否有回表問題
  4. 深度的看一下複雜語句(Group By、Order By等)是否跟索引有關係
  5. 檢查資料庫的配置,如Join_buffer、Buffer_pool等

Sql語句是否符合規範

  • 能夠快速縮小結果集的 WHERE 條件寫在前面,如果有恆量條 件,也儘量放在前面 ,例如 where 1=1   (這個我覺得順序沒有太大關係)   • 避免使用 GROUP BY、DISTINCT 等語句的使用,避免聯表查詢和子查詢   使用GROUP BY時,建議在建索引時考慮GROUP BY後面欄位的順序,減少排序,與 Order By類似,都可以利用索引來排序   DISTINCT注意使用,後面的所有欄位去重   • 能夠使用索引的欄位儘量進行有效的合理排列   適量建索引,過多也會產生問題,如:導致佔有記憶體過多,Buffer_Pool佔用   • 針對索引欄位使用 >, >=, =, <, <=, IF NULL 和 BETWEEN 將會 使用索引,如果對某個索引欄位進行 LIKE 查詢,使用 LIKE ‘%abc%’ 不能使用索引,使用 LIKE ‘abc%’ 將能夠使用索引   使用的時候儘量使用Explain分析一下是否真用上了(一般很準確的)   • 如果在 SQL 裡使用了 MySQL部分自帶函式,索引將失效   因為帶函數了,誰知道你想咋轉換,咋玩的,導致全表掃描,針對的是左邊欄位的函式,還有型別轉換也會導致索引失效   • 避免直接使用 select *,只取需要的欄位,增加使用覆蓋索引使用的可能   注意覆蓋索引,資料數量大,效果很明顯   • 對於大資料量的查詢,儘量避免在 SQL 語句中使用 order by 字句   用的時候注意利用索引,來減少排序   • 連表查詢的情況下,要確保關聯條件的資料型別一致,避免巢狀子查詢   數量大的時候注意是否建立被驅動表的的索引 (INL)   • 對於連續的數值,使用 Between 代替 In   在資料範圍連續的情況,推薦使用Between   • 對於Exist和In的的使用需要注意實際業務資料大小   In的內表全掃描,Exist外表全掃描。 外表小時用exist,內表小時用in。核心是儘量掃描小的資料,將大的資料使用索引   • where 語句中儘量不要使用 CASE 條件   會導致sql複雜,且不宜理解   • 當只要一行資料時使用 LIMIT 1
索引使用
• 索引佔磁碟空間,不要重複的索引,儘量短 • 只給常用的查詢條件加索引 • 過濾性高的列建索引,取值範圍固定的列不建索引 • 唯一的記錄新增唯一索引 • 頻繁更新的列不要建索引 • 不要對索引列運算 • 同樣過濾效果下,保持索引長度最小 • 合理利用組合索引,注意索引欄位先後順序 • 多列組合索引,過濾性高的欄位最前 • order by 欄位建立索引,避免 filesort • 組合索引,不同的排序順序不能使用索引 • <>!=無法使用索引 參考地址:https://developer.aliyun.com/article/709387 堅定信念,持之以恆 作者:堅持到底gl 出處:https://www.cnblogs.com/zhouguanglin/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連線,否則保留追究法律責任的權利。