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