[加快SQL 搜尋] SQL海量資料優化

[加快SQL 搜尋] SQL海量資料優化

[加快SQL 搜尋] SQL海量資料優化

資料來源:http://fecbob.pixnet.net/blog/post/39073559

01.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全資料表掃描
    
    select id from t where num is null
    可以在num上設置預設值0,確保表中num列沒有null值,然後這樣查詢

 

02.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全資料表掃描。優化器將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行。

 

03.應儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全資料表掃描,如:

    select id from t where num=10 or num=20
    可以這樣查詢:
    select id from t where num=10
    union all
    select id from t where num=20
    
04.in 和 not in 也要慎用,因為IN會使系統無法使用索引,而只能直接搜索表中的資料。如:
    
    select id from t where num in(1,2,3)
    對於連續的數值,能用 between 就不要用 in 了:
    select id from t where num between 1 and 3

 

05.儘量避免在索引過的字元資料中,使用非打頭字母搜索。這也使得引擎無法利用索引。[很難]

    見如下例子:
    SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
    SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
    SELECT * FROM T1 WHERE NAME LIKE ‘L%’
    即使NAME欄位建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不對全表所有資料逐條操作來完成任務。而第三個查詢能夠使用索引來加快操作。

 

06.應儘量避免在 where 子句中對欄位進行運算式操作,這將導致引擎放棄使用索引而進行全資料表掃描。
    
    SELECT * FROM T1 WHERE F1/2=100

 

07.應儘量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全資料表掃描

 

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

 

09.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

 

10.充分利用連接條件,在某種情況下,兩個表之間可能不只一個的連接條件,這時在 WHERE 子句中將連接條件完整的寫上,有可能大大提高查詢速度。
    
    例:
    SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO
    SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO=B.ACCOUNT_NO

 

11. 使用視圖加速查詢

 

12.能用DISTINCT的就不用GROUP BY

 

13.能用UNION ALL就不要用UNION

 

14.使用連接(JOIN)來代替子查詢(Sub-Queries)

   
15.使用聯合(UNION)來代替手動創建的臨時表  

 

 

 

 

 

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *