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

隨着業務體量和邏輯複雜度的增長,workcenter 對接口的性能耗時有了新的要求,而提高接口性能最有效的方法固然 對數據庫操做邏輯和SQL語句進行優化了。本篇分享一些數據庫性能優化的經驗和建議

數據庫結構優化

mysql 邏輯架構圖:
圖片mysql

  • 第一層:客戶端經過鏈接服務,將要執行的 sql 指令傳輸過來
  • 第二層:服務器解析並優化 sql,生成最終的執行計劃並執行
  • 第三層:存儲引擎,負責數據庫的存儲和提取

索引優化

索引包含一個或多個列的值。MySql 只能高效的利用索引的最左前綴列。索引的優點在於:sql

  • 減小查詢掃描的數據量
  • 避免排序和零時表
  • 將隨機 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 做爲數據庫操做的工具,誠然服務器

相關文章
相關標籤/搜索