Tune sql performance

Tune sql performance

1. table join 時, 先將各自 table 內的資料先過濾再 join

2. IN 與 EXISTS

  • IN: 與 EXISTS 原理剛好相反
           


相當於:
FOR pointB IN ( SELECT col2 FROM tableB )
    LOOP
    IF ( pointB.col2 是否存在於 tableA的 col2 )
    THEN 
        /*OUTPUT THE RECORD*/
    END IF;
END LOOP;

                              

  • EXISTS: 
           


相當於:
FOR pointA IN ( SELECT * FROM tableA )
    LOOP
    IF ( 該 pointA 的 Row 是否存在於 tableB 中 )
    THEN 
        /*OUTPUT THE RECORD*/
    END IF;
END LOOP;
  • 選擇時機: 外大內小 = IN,外小內大 = EXISTS, 同時應盡可能使用 NOT EXISTS 來代替 NOT IN,儘管二者都使用了NOT(都不能使用索引而降低速度),NOT EXISTS要比NOT IN查詢效率更高。

            

3. 在 where condition 中, 不要使用負向條件, 盡量用正向條件, 因為負向條件不行使用 Index 增加查詢效率

負向條件效率差:

Ex: 1. WHERE column1 <> 1 AND column1 <> 2

      2. WHERE column1 NOT IN (1, 2)

      若一定要使用 NOT IN, 那麼使用 NOT EXISTS 取代 NOT IN 可增加查詢效率, 因為負向表列不行使用 Index

正向條件效率較好:

Ex: 1. WHERE column1 < 1 AND column1 > 2

      2. WHERE column1 IN (3, 4, 5…)

參考:

 http://eeluck.pixnet.net/blog/post/27559378-in%E5%92%8Cexists%E7%9A%84%E5%B7%AE%E7%95%B0

http://www.nowamagic.net/database/db_DifferenceBetweenInAndExist.php