天天看點

分享Sql性能優化的一些建議

随着業務體量和邏輯複雜度的增加,workcenter 對接口的性能耗時有了新的要求,而提升接口性能最有效的方法當然 對資料庫操作邏輯和SQL語句進行優化了。本篇分享一些資料庫性能優化的經驗和建議

資料庫結構優化

mysql 邏輯架構圖:

分享Sql性能優化的一些建議
  • 第一層:用戶端通過連接配接服務,将要執行的 sql 指令傳輸過來
  • 第二層:伺服器解析并優化 sql,生成最終的執行計劃并執行
  • 第三層:存儲引擎,負責資料庫的存儲和提取

索引優化

索引包含一個或多個列的值。MySql 隻能高效的利用索引的最左字首列。索引的優勢在于:

  • 減少查詢掃描的資料量
  • 避免排序和零時表
  • 将随機 IO 變為順序 IO (順序 IO 的效率高于随機 IO)

優化建議:

(1)針對特别長的字元串,可以使用字首索引,根據索引的選擇性選擇合适的字首長度

(2)使用多列索引的時候,可以通過 AND 和 OR 文法連接配接

(3)索引在 where 條件查詢和 group by 文法查詢的時候特别有效

(4)将範圍查詢放在條件查詢的最後,防止範圍查詢導緻的右邊索引失效的問題

(5)索引最好不要選擇過長的字元串,而且索引列也不宜為 null

SQL查詢優化

查詢品質的三個重要名額:(1)響應時間(服務時間、排隊時間)、(2)掃碼的行、(3)傳回的行

(1)避免查詢無關的列,如使用 Select * 傳回所有的清單

(2)避免查詢無關的行

(3)切分查詢。将一個對伺服器壓力較大的任務,分解到一個較長的時間中,并分多次執行。如要删除一萬條資料,可以分 10 次執行,每次執行完成後暫停一段時間,再繼續執行。過程中可以釋放伺服器資源給其他任務

(4)分解關聯查詢。将多表關聯查詢的一次查詢,分解成對單表的多次查詢。可以減少鎖競争,查詢本身的查詢效率也比較高。因為 MySql 的連接配接和斷開都是輕量級的操作,不會由于查詢拆分為多次,造成效率問題

(5)注意 count 的操作隻能統計不為 null 的列,是以統計總的行數使用 count (*)

(6)group by 按照辨別列分組效率高,分組結果 不宜出現分組列之外的列

(7)關聯查詢延遲關聯,可以根據查詢條件先縮小各自要查詢的範圍,再關聯

(8)Limit 分頁優化。可以根據索引覆寫掃碼,再根據索引列關聯自身查詢其他列

(9)Union 查詢預設去重,如果不是業務必須,建議使用效率更好的 Union All

TypeORM性能優化

WorkCenter 采用了 TypeORM 作為資料庫操作的工具,誠然