SQL查詢語句優化的實用方法

  查詢語句的優化是SQL效率優化的一個方式,能夠經過優化sql語句來儘可能使用已有的索引,避免全表掃描,從而提升查詢效率。最近在對項目中的一些sql進行優化,總結整理了一些方法。sql

一、在表中創建索引,優先考慮where、group by使用到的字段。數據庫

 

二、儘可能避免使用select *,返回無用的字段會下降查詢效率。以下:函數

SELECT * FROM t 優化

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

 

三、儘可能避免使用in 和not in,會致使數據庫引擎放棄索引進行全表掃描。以下:io

SELECT * FROM t WHERE id IN (2,3)效率

SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)select

優化方式:若是是連續數值,能夠用between代替。以下:sql語句

SELECT * FROM t WHERE id BETWEEN 2 AND 3搜索

若是是子查詢,能夠用exists代替。以下:

SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)

 

四、儘可能避免使用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

(PS:若是or兩邊的字段是同一個,如例子中這樣。貌似兩種方式效率差很少,即便union掃描的是索引,or掃描的是全表)

 

五、儘可能避免在字段開頭模糊查詢,會致使數據庫引擎放棄索引進行全表掃描。以下:

SELECT * FROM t WHERE username LIKE '%li%'

優化方式:儘可能在字段後面使用模糊查詢。以下:

SELECT * FROM t WHERE username LIKE 'li%'

 

六、儘可能避免進行null值的判斷,會致使數據庫引擎放棄索引進行全表掃描。以下:

SELECT * FROM t WHERE score IS NULL

優化方式:能夠給字段添加默認值0,對0值進行判斷。以下:

SELECT * FROM t WHERE score = 0

 

七、儘可能避免在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%'

 

八、當數據量大時,避免使用where 1=1的條件。一般爲了方便拼裝查詢條件,咱們會默認使用該條件,數據庫引擎會放棄索引進行全表掃描。以下:

SELECT * FROM t WHERE 1=1

優化方式:用代碼拼裝sql時進行判斷,沒where加where,有where加and。

 

  其實,總結起來,你們應該也發現了,就是在查詢的時候,要儘可能讓數據庫引擎使用索引。而如何讓數據庫按咱們的意思去使用索引就涉及到掃描參數(SARG)的概念。在數據庫引擎在查詢分析階段,會使用查詢優化器對查詢的每一個階段(如一個帶子查詢的sql語句就存在不一樣的查詢階段)進行分析,來決定須要掃描的數據量。若是一個階段能夠被用做掃描參數,那麼就能夠限制搜索的數據量,從而必定程度上提升搜索效率。

SARG的定義:用於限制搜索的一個操做,由於它一般是指一個特定的匹配,一個值的範圍內的匹配或者兩個以上條件的AND鏈接。

 

  因此,咱們要讓咱們寫的查詢條件儘可能可以讓引擎識別爲掃描參數。具體作法,就如前面提到的這些方法。

相關文章
相關標籤/搜索