SQL優化的幾種方法

2021-10-01 19:44:16 字數 3327 閱讀 4119

1、盡量避免使用select *,返回無用的字段會降低查詢效率。如下:

select * from test

優化方式:使用具體的字段代替*,只返回使用到的字段。

2、對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。

3、盡量避免進行null值的判斷,會導致資料庫引擎放棄索引進行全表掃瞄。盡量避免null欄位,定義時盡量使用 not null.原因是允許null時不方便查詢優化,復合索引也會失效,而且如果列有索引時會額外占用空間: a int(10) not null default 0 如下:

select * from t where score is null

優化方式:可以給字段新增預設值0,對0值進行判斷。如下:

select * from t where score = 0

4、應盡量避免在where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄。mysql只有對以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的like。 可以在like操作中使用索引的情形是指另乙個運算元不是以萬用字元(%或者_)開頭的情形。

5、應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄。如下:

select * from t where id = 1 or id = 3

優化方式:可以用union代替or。如下:

select * from t where id = 1

union

select * from t where id = 3

如果or兩邊的字段是同乙個,如例子中這樣。貌似兩種方式效率差不多,即使union掃瞄的是索引,or掃瞄的是全表。

6、盡量避免使用in 和not in,會導致資料庫引擎放棄索引進行全表掃瞄。如下:

select * from t where id in (2,3)

select * from t1 where username in (select username from t2)

優化方式:如果是連續數值,可以用between代替。如下:

select * from t where id between 2 and 3

如果是子查詢,可以用exists代替。如下:

select * from t1 where exists (select * from t2 where t1.username = t2.username)

7、盡量避免在字段開頭模糊查詢,會導致資料庫引擎放棄索引進行全表掃瞄。如下:

select * from t where username like 『%li%』

優化方式:盡量在字段後面使用模糊查詢。如下:

select * from t where username like 『li%』

8、盡量避免在where條件中等號的左側進行表示式、函式操作,會導致資料庫引擎放棄索引進行全表掃瞄。如下:

select * from t2 where score/10 = 9

select * from t2 where substr(username,1,2) = 『li』

優化方式:可以將表示式、函式操作移動到等號右側。如下:

select * from t2 where score = 10*9

select * from t2 where username like 『li%』

9、應盡量避免在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄

如:select id from t where substring(name,1,3)=『abc』

–name以abc開頭的id應改為:select id from t where name like 『abc%』

10、不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。如:

select id from t where substring(name,1,3)=『abc』–name

select id from t where datediff(day,createdate,『2005-11-30』)=0–『2005-11-30』

優化方式

select id from t where name like 『abc%』

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

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

12、很多時候用 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)

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

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

15、盡量使用數字型字段,若只含數值資訊的字段盡量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線時會逐個比較字串中每乙個字元,而對於數字型而言只需要比較一次就夠了。

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

17、當資料量大時,避免使用where 1=1的條件。通常為了方便拼裝查詢條件,我們會預設使用該條件,資料庫引擎會放棄索引進行全表掃瞄。如下:

select * from t where 1=1

優化方式

用**拼裝sql時進行判斷,沒where加where,有where加and

18、避免頻繁建立和刪除臨時表,以減少系統表資源的消耗。

sql優化的幾種方法

1.盡量不要使用 select from t 用具體的字段列表代替 不要返回用不到的任何字段。2.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。3.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行...

sql優化的幾種方法

1 在表中建立索引,優先考慮where group by使用到的字段。2 盡量避免使用select 返回無用的字段會降低查詢效率。如下 select from t 優化方式 使用具體的字段代替 只返回使用到的字段。3 盡量避免使用in 和not in,會導致資料庫引擎放棄索引進行全表掃瞄。如下 se...

SQL優化 的幾種方法 總結

一,基本查詢語句 1 不要使用 select from table 用具體的字段列表代替 不要返回用不到的任何字段 二,where查詢語句 1 應盡量避免在 where 子句中使用 或 操作符,否則將引擎放棄使用索引而進行全表掃瞄。2 應盡量避免在 where 子句中使用 or 來連線條件,否則將導...