1. 程式人生 > >sql查詢優化相關

sql查詢優化相關

整型 計算表達式 rom num varchar creat where 提高效率 sel

1、關於字段默認值

要學適當的學會為字段加默認值,在where子句中 where count is null 是會讓搜索引擎進行全表搜索而放棄使用索引,如果采用where count =0 則會提高效率

2、盡量不要在where 子句中使用!=或者<> 優化器無法通過索引來確定將要命中的行數而進行全表掃描

3、盡量避免使用or關鍵字,也會使搜索引擎放棄使用索引而進行全表掃描

可以使用union all 進行查詢 例如 select * from name where id=1 or id=2

改為 select * from name where id=1 union all select * from name where id =2

4、in 和not in 也要慎用 因為這樣也會使引擎放棄索引進行全表查找

若果是對連續的數值進行查找 例如 select * from t where id in (1,2,3)

則可以修改為 select * from t where id between 1 and 3

5、盡量不要在索引過的字符數據中使用非打頭字母搜索,這樣也會放棄使用索引

例如 select * from t where name like ‘%L%‘

select * from t where substring(name,1,2) =‘L‘

使用 select * from t where name like ‘L%‘ 可以用索引

6、可以強制使用索引來進行優化

在where 子句中使用參數化查詢,也會導致全表掃描,sql只有在運行時才會進行局部變量的解析,但是諸如索引之類的優化程序不能推遲到運行時必須在編譯時進行選擇   

例如 select * from t where num =@num

可以進行優化 select * from t with (index(索引名)) where num =@num

7、任何對列的操作都會引起表掃描,它包括數據庫函數、計算表達式,查詢時要盡可能移動到等號右側進行,不要在=左邊進行函數、算術運算或者其他計算表達式,這樣索引可能無法正確使用

8、要註意的是。如果使用索引字段作為查詢條件時,如果創建的是符合索引,一定要使用符合索引的第一個字段作為條件才會起到作用,並且盡可能讓字段順序和索引順序一致

9、善用exist

才查詢是否存在某條數據時,用exist代替查詢count

select num from a where num in(select num from b)
上面這個語句可以用

select num from a where exist (select 1 from b where num=a.num)

代替 因為後面的這個語句沒有使用in等類似會產生掃描表的關鍵字。

10、大事務的操作要謹慎使用,提高系統的並發能力

11、避免使用不兼容的數據類型,例如float和int,char和varchar,binary和varbinary是不兼容的,

例如select name from t where sal>60000

sal字段是decimal類型的,那麽優化器很難對這個sql優化,60000是整型,此時我們不能單純地靠搜索引擎去優化,完全可以靠程序將整型轉化為decimal

12、對於表連接要盡可能的把連接條件寫全,是有可能提高查詢效率的

13、善於使用視圖

把表的一個子集進行排序並創建視圖,有時可以加速查詢,它有助於避免多重排序。

我們可以把要執行多次的sql創建成視圖,例如

SELECT cust.namercvbles.balance,„„other columns
FROM custrcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
我們創建一個視圖

creat view aaa as

SELECT cust.namercvbles.balance,„„other columns
FROM custrcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0

ORDER BY cust.name

然後 select * from aaa where .postcode>“98000” ,這樣可以減少io操作(視圖中的數據量比主表中的少)從而提高效率

14、能用distinct 就不用groupby,能用unionall 就不要用union (避免distinct操作)

15、註意select into 的使用 會導致鎖表

切記 sql 效率主要是考察兩個方面 表掃描的次數 索引的利用率

sql查詢優化相關