SQL 語句優化

2021-10-19 10:27:38 字數 2936 閱讀 4576

盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。(如agentcode等)

應盡量避免在 where 子句中對字段進行 null 值判斷,建立表時 null 是預設值,但大多數時候應該使用 not null,或者使用乙個特殊的值,如 0,-1 作為預設值。

應盡量避免在 where 子句中使用 != 或 <> 操作符。mysql 只有對以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的 like。

避免使用暱稱表,如果非要使用的話建議將暱稱表落到本地(定時任務等),暱稱表的效率極其低下,本人就因此差點出現生產問題。

避免在where語句中使用or,本身就容易出現錯誤資料(查錯),會放棄索引進行全盤掃瞄,可以如下使用union

select agentcode from laagent where agentcode='1' union all select agentcode from laagent where agentcode='2';
全盤掃瞄的情形:

select * from latree where agentcode like '%a%'';

select * from latree where agentcode like '%a%';

--此情形不會,會使用索引

select * from latree where agentcode like 'a%'';

where條件中避免使用函式,避免使用表示式操作(公司dba建議)。

很多時候用exists替換in是很明智的。

--低效率

select id from a where id in(select id from b)

--高效率

select id from a where exists(select 1 from b where id=a.id)

表索引的數目不要太多,最好不要超過6個,工號證件號這種的可以建索引,性別姓名這種的就不必了。索引會提高select的效率,但會降低insert與update的效率,在大批量匯入資訊比較顯著。

應盡可能的避免更新 clustered 索引資料列, 因為 clustered 索引資料列的順序就是表記錄的物理儲存順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引資料列,那麼需要考慮是否應將該索引建為 clustered 索引。

只含數值資訊的盡量使用數字型字段,不要使用字元型字段,會降低查詢與鏈結的效率,增加儲存開銷。

使用varchar代替char,儲存空間小,搜尋效率更高。

select 具體的字段替換select * ,避免闊表等麻煩。

使用臨時表儲存中間結果。簡化sql的重要方法,避免重複掃瞄主表,減少程式執行中「共享鎖」阻塞「更新鎖」,提高併發。

with ur。

盡量避免出現5個表以上的連線,可以引入臨時表,少用子查詢。

對應薪資等需要進行計算的資料,先處理後放在表中再進行查詢。

in後面值的列表中,出現最頻繁的值放最前面。

大、複雜的資料處理考慮寫在儲存過程中。

當伺服器的記憶體夠多時,配製執行緒數量 = 最大連線數+5,這樣能發揮最大的效率;否則使用配製執行緒數量< 最大連線數,如果還是數量 = 最大連線數+5,嚴重的損害伺服器的效能。

盡量使用 exists 代替 select count(1) 來判斷是否存在記錄。count 函式只有在統計表中所有行數時使用,而且 count(1) 比

*效率更高。

索引的使用規範:

避免使用substr,多用索引

select * from record where substr(card_no, 1, 4) = '5378' --13秒

select * from record where card_no like '5378%'-- < 1秒

select * from record where amount/30 < 1000--11秒

select * from record where amount < 1000*30-- < 1秒

select * from record where convert(char(10), date, 112) = '19991201'--10秒

select * from record where date = '1999/12/01'-- < 1秒

批量插入或者更新而非逐條更新插入,excel批量匯入功能等。

儲存過程中,能夠用 sql 語句的,不要用迴圈去實現。

sql 語句用大寫,因為 oracle 總是先解析 sql 語句,把小寫的字母轉換成大寫的再執行。

選擇最有效率的表名順序

將不需要的記錄在 group by 之前過濾掉(group by 寫在最後)

sql 語句用大寫,因為 oracle 總是先解析 sql 語句,把小寫的字母轉換成大寫的再執行。

別名的使用,別名是大型資料庫的應用技巧,就是表名、列名在查詢中以乙個字母為別名,查詢速度要比建連線表快 1.5 倍。

避免死鎖,在你的儲存過程和觸發器中訪問同乙個表時總是以相同的順序;事務應經可能地縮短,在乙個事務中應盡可能減少涉及到的資料量;永遠不要在事務中等待使用者輸入。

避免使用臨時表,除非卻有需要,否則應盡量避免使用臨時表,相反,可以使用表變數代替。大多數時候(99%),表變數駐紮在記憶體中,因此速度比臨時表更快,臨時表駐紮在 tempdb 資料庫中,因此臨時表上的操作需要跨資料庫通訊,速度自然慢。

不要使用觸發器

索引建立規則:

mysql 查詢優化總結:

mysql 備份:

當只要一行資料時使用 limit 1(db2 是 fetch frirst i rows only )

任何對列的操作都將導致表掃瞄,它包括資料庫函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊。

SQL 語句優化 OR 語句優化案例

從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句 select ws.nodeid,wi.laststepid,wi.curstepid from workflowinfo ...

sql語句優化!

1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...

SQL語句優化

explain sql 反饋sql語句執行資訊 1 優化 select min id as nid,uid pmzongfen updatetime picid gg from qd mouldu qd sell limit 1 select uid pmzongfen updatetime pic...