SQL語句優化的經驗分享

你好我是辰兮,很高興你能來閱讀,本篇總結了一些SQL語句
相關的優化技巧,分享獲取新知,大家一起進步。


1.對查詢進行優化,要儘量避免全表掃描,首先應考慮在where及order by涉及的列上建立索引。

ps:能用索引查的可以考慮用索引


2.應儘量避免在where句中對字段進行null值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

ps:null將會導致索引失效

最好不要給數據庫留NULL,儘可能的使用NOT NULL填充數據庫.備註、描述、評論之類的可以設置爲NULL,其他的,最好不要使用NULL。

不要以爲NULL不需要空間,比如: char(100) 型,在字段建立時,空間就固定了,不管是否插入值(NULL也包含在內) ,都是佔用100個字符的空間的,如果是varchar這樣的變長字段,null 不佔用空間。

可以在num.上設置默認值0,確保表中num列沒有null值,然後這樣查詢;

select id from t where num = 0

3.應儘量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

ps:謹慎使用!=或<>操作符


4.應儘量避免在where子句中使用or來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or Name = 'admin'

可以這樣

select id from t where num = 10
union all
select id from t where Name = 'admin'

5.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)

用exists替換in

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

6.下面的查詢也將導致全表掃描:

select id from t where name like ‘%abc%

ps:全表查詢就會導致查詢效率低


7.應儘量避免在where子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2 = 100
應該改爲
select id from t where num= 100*2

8.應儘量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where substring(name,1,3) = ’abc’

改爲

select id from t where name like 'abc%'

ps:不要在SQL語句上使用函數


9.不要在where子句中的“="左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

ps:減少在SQL語句上的計算


10.Update語句,如果只更改1、2個字段,不要Update全部字段,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日誌。

ps:update操作只改一兩個字段的 就不要全改!


11.對於多張大數據量(這裏幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。

ps:數據量過多的先分頁再JOIN


12.這樣不帶任何條件的count會引起全表掃描,並且沒有任何業務意義,是要杜絕的。

select count(*) from table;

13.任何地方都不要使用select * from t,用具體的字段列表代替"*",不要返回用不到的任何字段。

ps:要用具體的字段代替*


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

ps:索引不是越多越好


15.未完待續…


The best investment is to invest in yourself

在這裏插入圖片描述

2020.06.20 記錄辰兮的第85篇博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章