SQL優化方法


SQL優化方法:

 
改變 SQL 執行計划
明確了優化目標之后,我們需要確定達到我們目標的方法。對於 SQL 語句來說,達到上述2個目標的方法其實只有一個,那就是改變 SQL 的執行計划,讓他盡量“少走彎路”,盡量通過各種“捷徑”來找到我們需要的數據,以達到 “減少 IO 次數” 和 “降低 CPU 計算” 的目標。
盡量少 join
MySQL 的優勢在於簡單,但這在某些方面其實也是其劣勢。MySQL 優化器效率高,但是由於其統計信息的量有限,優化器工作過程出現偏差的可能性也就更多。對於復雜的多表 Join,一方面由於其優化器受限,再者在 Join 這方面所下的功夫還不夠,所以性能表現離 Oracle 等關系型數據庫前輩還是有一定距離。但如果是簡單的單表查詢,這一差距就會極小甚至在有些場景下要優於這些數據庫前輩。

盡量少排序
排序操作會消耗較多的 CPU 資源,所以減少排序可以在緩存命中率高等 IO 能力足夠的場景下會較大影響 SQL 的響應時間。
  對於MySQL來說,減少排序有多種辦法,比如:
  通過利用索引來排序的方式進行優化
  減少參與排序的記錄條數
  非必要不對數據進行排序

盡量避免select *
Select * 一般都會造成全表掃描,顯示所有列,select 需要的字段即可。
盡量用 join 代替子查詢
雖然 Join 性能並不佳,但是和 MySQL 的子查詢比起來還是有非常大的性能優勢。MySQL 的子查詢執行計划一直存在較大的問題,雖然這個問題已經存在多年,但是到目前已經發布的所有穩定版本中都普遍存在,一直沒有太大改善。雖然官方也在很早就承認這一問題,並且承諾盡快解決,但是至少到目前為止我們還沒有看到哪一個版本較好的解決了這一問題。  
盡量用 union all 代替 union:
union 和 union all 的差異主要是前者需要將兩個(或者多個)結果集合並后再進行唯一性過濾操作,這就會涉及到排序,增加大量的 CPU 運算,加大資源消耗及延遲。所以當我們可以確認不可能出現重復結果集或者不在乎重復結果集的時候,盡量使用 union all 而不是 union。
禁用外鍵

----------------------------------------------
 
SQL優化的基本原則
 
避免大sql
一個SQL只能在一個cpu上運行
高並發環境中,大SQL容易影響性能問題
可能一個大SQL把數據庫搞死
拆分SQL
保持事物的短小精悍
即開即用,用完即關
無關操作踢出事務,減少資源占用
保持一致性的前提下,拆分事務
避免大批量更新
避開高峰
白天限制速度
加sleep
避免類型轉換
避免取過量數據,建議使用limit
避免在SQL 語句中進行數學運算、函數計算、邏輯判斷等操作
避免OR
同一字段,推薦in
不同字段,推薦union
優先優化高並發的 SQL,而不是執行頻率低某些“大”SQL
從全局出發優化,而不是片面調整 
盡可能對每一條運行在數據庫中的SQL進行explain

-------------------------------------------------------------
索引的設計原則
1.搜索的索引列,不一定是所要選擇的列,換句話說,最適合索引的列是出現在WHERE 子句中的列,或連接子句中指定的列,而不是出現在SELECT 關鍵字后的選擇列表中的列。
2.使用唯一索引,考慮某列中值的分布。對於惟一值的列,索引的效果最好,而具有多個重復值的列,其索引效果最差。
3.使用短索引。如果對串列進行索引,應該指定一個前綴長度,只要有可能就應該這樣做。例如,如果有一個CHAR(200) 列,如果在前10 個或20 個字符內,多數值是惟一的,那么就不要對整個列進行索引。對前10 個或20 個字符進行索引能夠節省大量索引空間,也可能會使查詢更快。
4.利用最左前綴。在創建一個n 列的索引時,實際是創建了MySQL可利用的n 個索引。多列索引可起幾個索引的作用,因為可利用索引中最左邊的列集來匹配行。這樣的列集稱為最左前綴。
5.不要過度索引。不要以為索引“越多越好”,什么東西都用索引是錯的。每個額外的索引都要占用額外的磁盤空間,並降低寫操作的性能,這一點我們前面已經介紹 過。在修改表的內容時,索引必須進行更新,有時可能需要重構,因此,索引越多,所花的時間越長。如果有一個索引很少利用或從不使用,那么會不必要地減緩表 的修改速度。此外,MySQL在生成一個執行計划時,要考慮各個索引,這也要費時間。創建多余的索引給查詢優化帶來了更多的工作。索引太多,也可能會使 MySQL選擇不到所要使用的最好索引。只保持所需的索引有利於查詢優化。如果想給已索引的表增加索引,應該考慮所要增加的索引是否是現有多列索引的最左 索引。如果是,則就不要費力去增加這個索引了,因為已經有了。


-------------------------------------------------
 
主鍵索引,主鍵上會自動增加一個主鍵索引
唯一索引,數據是唯一的時候加上唯一索引,也就是唯一約束,使用唯一索引查詢效率要比普通索引和多列索引速度快
單列索引(普通索引),任何列上都可添加
多列索引(組合索引),如果where字句后面有多列,或者數據有重復的,這樣需要加多列索引,盡量避免對組合索引的列進行更新,因為更新數據后索引也會重新維護。
注意:修改表結構會,索引會失效,需要重構索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM