sql常用優化手段

2021-10-05 03:45:19 字數 2124 閱讀 4754

常見優化手段:

where及order_by的列建索引

避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄。

避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,可以在字段上設定預設值0

避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,使用union all替代

like '%abc%'導致全表掃瞄,可以考慮全文檢索

in 和 not in 也要慎用,否則會導致全表掃瞄,連續的數值可用between替代in

where 子句中使用引數,也會導致全表掃瞄,from t where num=@num,可改為from t with(index(索引名)) where num=@num

where 子句中對字段進行表示式操作會導致全表掃瞄,where num/2=100可改為 where num=100*2

避免在where子句中對字段進行函式操作會導致全表掃瞄,where substring(name,1,3)='abc』可改為where name like 『abc%』

有些時候可用exists 代替 in

聯合索引符合前置原則

性別等少量的資料建立索引,無用

索引並不是越多越好,mysql最多15個,降低insert,update效率

避免更新 clustered 索引資料列,因為 clustered 索引資料列的順序就是表記錄的物理儲存順序

盡量使用數字型字段,只含數值資訊的字段不要設計為字元型

使用 varchar/nvarchar 代替 char/nchar 因為變長字段儲存空間更小

不要使用 select * from t ,用具體的字段列表代替「*」,不要返回用不到的任何字段。

盡量使用表變數來代替臨時表。如果表變數包含大量資料,請注意索引非常有限(只有主鍵索引)。

避免頻繁建立和刪除臨時表,以減少系統表資源的消耗。

對於一次性事件,最好使用匯出表代替臨時表

在新建臨時表時,如果一次性插入資料量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果資料量不大,為了緩和系統表的資源,應先create table,然後insert。

如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。

盡量避免使用游標,因為游標的效率較差,如果游標操作的資料超過1萬行,那麼就應該考慮改寫。

使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

對小型資料集使用 fast_forward 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。在結果集中包括「合計」的例程通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。

在所有的儲存過程和觸發器的開始處設定 set nocount on ,在結束時設定 set nocount off 。無需在執行儲存過程和觸發器的每個語句後向客戶端傳送 done_in_proc 訊息。

盡量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理。

盡量避免大事務操作,提高系統併發能力。

代替in 的改寫方案:

1表中數值某些情況用exists代替

in-:::如果子查詢的結果記錄小,主查詢中的表大又有索引時使用。 in先執行子查詢,in是把外表和內錶作hash連線,另外in時不對null進行處理。,

exists-:如果外層的主查詢記錄較少,子查詢中的表大又有索引時使用。exists以外層表為驅動表,先訪問外表,對外表作loop迴圈,每次loop迴圈再對內表進行查詢。

2 有限數值:

explain select *

from history_join_recording hjr right join (

select 12054 as cid union all

select 65158 union all

select 102585

) as tmp on hjr.join_recording_id = tmp.cid

MySQL 常用優化手段

表設計盡量小的字段 資料庫表越小,執行查詢越快 字段盡量設定not null 執行查詢不用比較null值 部分文字欄位如性別,省份使用enum 數值處理比文字塊 事物以begin 關鍵字開始,commit關鍵字結束。在使用者多時,事務的資料庫鎖定會造成嚴重延遲,所以要鎖定表 lock table i...

常用的效能優化手段(記憶體優化方法)

1.使用 arc 進行記憶體管理,arc 是 ios 提供的採用自動引用計數方式進行管理記憶體的一種手法,它避免了最常見的忘記釋放物件記憶體而引起的記憶體洩漏問題。它的工作原理是編譯器會自動的為你管理 retain 和 release 過程。2.復用 reuseidentifier,在使用單元格時應...

redis常用記憶體優化手段與引數

通過上面的實現上的分析,可以看出redis的記憶體管理成本比較高,即占用了過多的記憶體,redis的作者對這點也很清楚,所以提供了一系列的引數和手段來控制和節省記憶體 首先最重要的一點是不要開啟redis的vm選項,即虛擬記憶體功能。這個本來是作為redis儲存超出物理記憶體資料的一種資料在記憶體與...