SQL優化之索引使用

2021-07-23 21:32:47 字數 1560 閱讀 2768

最近找工作,遇到乙個面試題:sql哪些關鍵字會忽略索引?

因為之前沒這方面的經驗,當時懵逼了,隨便扯了一點。最終有沒能通過面試很遺憾。

我們都知道對查詢進行優化,應盡量避免全表掃瞄,多使用索引,首先應考慮在 where 及 order by 涉及的列上建立索引。不過應該注意兩點:

1、並不是所有索引對查詢都有效,sql是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,sql查詢可能不會去利用索引,如一表中有字段 ***,male、female幾乎各一半,那麼即使在***上建了索引也對查詢效率起不了作用。

2、索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

另外在以下情況下sql也會略索引進行全表掃瞄:

1、where 子句中使用!=或<> 或 is null 操作符,將放棄使用索引而進行全表掃瞄;

2、where 子句中 or 操作符連線查詢條件,將放棄使用索引而進行全表掃瞄;

3、where 中使用like關鍵字並且%是前置的,將放棄使用索引而進行全表掃瞄;如:select id from t where name like 『%c』;

4、where 中使用not in 將放棄使用索引而進行全表掃瞄,使用in保留索引使用;

5、如果在 where 子句中使用引數,也會導致全表掃瞄。因為sql只有在執行時才會解析區域性變數,但優化程式不能將訪問計畫的選擇推遲到執行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計畫,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃瞄:

select id from t where num=@num  可以改為強制查詢使用索引:  select id from t with(index(索引名)) where num=@num

6、在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:select id from t where num/2=100   應改為:  select id from t where num=100*2

7、在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–』2005-11-30′生成的id

應改為:

select id from t where name like 『abc%』

select id from t where createdate>=』2005-11-30′ and createdate<』2005-12-1′

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

SQL優化之索引

sql優化有很多方法,今天來說一說資料庫索引。舉例說明 假設有乙個圖書book表,裡面有欄位id,name,isbn等。如果圖書數量巨大的話,我們通過isbn查詢通常是比較慢的。新增索引 create index index isbn on book isbn 查詢時間從0.134縮短到0.001,...

SQL優化之索引

舉例說明 假設有乙個圖書book表,裡面有欄位id,name,isbn等。如果圖書數量巨大的話,我們通過isbn查詢通常是比較慢的。這裡寫描述 新增索引 create index index isbn on book isbn 再次執行查詢 這裡寫描述 查詢時間從0.134縮短到0.001,效果還是...

sql優化 使用索引

專案中使用了大量的sql,對於查詢sql,如果沒有使用索引會對查詢速度造成很大的影響,例如如下sql select a.name,b.id from tablea a join tableb b on a.id b.other id where a.name test and b.pin 123 a...