對查詢進行優化,要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
select id from t where num is null
最好不要給數據庫留NULL,盡可能的使用 NOT NULL填充數據庫。
備注、描述、評論之類的可以設置為 NULL,其他的,最好不要使用NULL。
不要以為 NULL 不需要空間,比如:char(100) 型,在字段建立時,空間就固定了, 不管是否插入值(NULL也包含在內),都是占用 100個字符的空間的,如果是varchar這樣的變長字段, null 不占用空間。
可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num = 0
應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描。
應盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描
select id from t where num=10 or Name = 'admin'
可以這樣查詢:
select id from t where num = 10union allselect id from t where Name = 'admin'
in 和 not in 也要慎用,否則會導致全表掃描
select id from t where num in(1,2,3)
對于連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
下面的查詢也將導致全表掃描
select id from t where name like ‘%abc%'
若要提高效率,可以考慮全文檢索。
如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num = @num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num = @num
應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2 = 100
應改為:
select id from t where num = 100*2
應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3) = 'abc' --name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30′) = 0 -
主站蜘蛛池模板:
治多县|
兖州市|
扎赉特旗|
政和县|
留坝县|
宁陕县|
萍乡市|
赤峰市|
吴忠市|
南陵县|
五指山市|
高邑县|
绥阳县|
东乡族自治县|
砀山县|
陆丰市|
新源县|
汽车|
安岳县|
林芝县|
石屏县|
龙里县|
汕尾市|
闻喜县|
承德县|
延庆县|
武汉市|
长武县|
金昌市|
苏尼特左旗|
溆浦县|
久治县|
黄山市|
南康市|
隆昌县|
宜宾市|
涡阳县|
金昌市|
聊城市|
朔州市|
大英县|