簡單SQL優化小記

2021-07-09 11:26:16 字數 1749 閱讀 9083

簡單sql優化小記

思路小記:避免使用模糊的匹配盡量匹配精確的值。

like,or,in,is null語句可能會全表掃瞄而放棄索引。

注:or語句在連線子條件時如果某乙個條件沒有索引那麼所有將導致所有條件放棄索引,使用全表掃瞄。

like語句在條件為"%..."時會放棄索引而全表掃瞄,而"...%"則走索引。 記:

<>,!=也會引起全表掃瞄(不等於可以替換成or連線,例:x<>'zhy' 替換成 x<'zhy' or x>'zhy')。

避免在查詢時對where語句的條件列引數進行計算或者函式運算,否則將導致全表掃瞄(等號'='的左邊不要進行表示式計算)。

在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

可以使用exists代替in語句。

建立索引會提高查詢時的效率,但是會降低insert和update的效率。

更新時語句盡量只寫經常更新的字段,不然會造成開銷浪費還會生成很多不必要的日誌。

建表時盡量使用數字型的字段,少用字元型字段。

盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長字段儲存空間小,可以節省儲存空間,其次對於查詢來說,在乙個相對較小的字段內搜尋效率顯然要高些。

避免使用select *,要把所需要的字段一一列全。

少使用臨時表。

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

盡量先分頁再join。

使用select count(column)代替select count(*)(後者是全表掃瞄)。

count(*) 跟 count(1) 的結果一樣,都包括對null的統計,而count(column) 是不包括null的統計。

當mysql認為符合條件的記錄在30%以上,它就不會再使用索引,因為mysql認為走索引的代價比不用索引代價大,所以優化器選擇了自己認為代價最小的方式(注意是認為,是mysql的估算預期)。

例:select column from table_a where p=1 or p=2;

可優化為:

select column from table_a where p=1

union all

select column from table_a where p=2;

union all語句會保留兩個查詢結果的所有記錄,union語句則會去重。

例:select column from table_a where p in (3,4,5);

可優化為:

select column from table_a where p between 1 and 3;

例:select column from table_a where p/100=2;

可優化為:

select column from table_a where p=100*2;

例:select column from table_a where p in (select column from table_b);

可以優化為:

select column from table_a a where exists(select 1 from table_b where column=a.column);

斜率優化小記

參考資料 下文將以一道例題為引子,描述最簡單的斜率優化的一般過程。你有一支由n名士兵組成的部隊,士兵從1到n編號,要將他們拆分成若干個特別行動隊調入戰場。出於默契的考慮,同一支行動隊的隊員的編號應該連續。編號為i的士兵的初始戰鬥力為xixi,一支行動隊的初始戰鬥力為隊內所有隊員初始戰鬥力之和。通過長...

簡單的sql查詢優化

1 sql中禁止用select from 的寫法 缺點 將會增加服務區io的輸出負擔 2 如果乙個sql比較複雜 則寫完的sql 可以用 在plsql 中用f5 來看起執行計畫,例如sql select from exp booking where booking id like 123123123...

sql查詢小記

1 在mysql中判斷某個字段是否為空需要使用is null 或者 is not null 在mysql5.2.7中測試通過。例子1 select from test where code is null 例子2 select from test where code is not null 2 s...