一些優化SQL的方式

一些優化SQL的方式

一、 設Index(索引)

但並不是每個欄位(column)都需要,應視其必要性。

以下狀況設index,可增加其效能:
1. 在經常需要查詢的column上。
2. 在主鍵(PK, Primary Key)column上,強制該column的唯一性和資料的排列結構。
3. 經常用於連線的column上,主要是外來鍵(FK, Foreign key)。
4. 經常需要根據範圍查詢的column。
5. 經常需要排序的column。
6. 經常使用在WHERE中的column。

不該使用的狀況:
1. 不常被查詢、使用的column
2. 太過大或太小的資料型別,如text、image、bit等
3. 常常被修改的column

 

二、Symbol Operator(方向運算符號)

我們常用 >, <, =, != 等運算符號在查詢裡 ,可以透過已建立過index索引的欄位來加快查詢的速度。

例如:
SELECT * FROM TABLE WHERE COLUMN > 8

應該寫成以下:
SELECT * FROM TABLE WHERE COLUMN >= 9

效能會比較好。

三、Wildcard(模糊查詢)

使用模糊查詢時,很容易拖慢速度查詢速度,尤其是table資料非常大量時,可以用前綴、後綴優化,而不要全部使用,如果常常使用最好設index。

例如:
1. Full wildcard:SELECT * FROM TABLE WHERE COLUMN LIKE '%query%'

2. Postfix wildcard:SELECT * FROM TABLE WHERE COLUMN LIKE 'query%'

3. Prefix wildcard:SELECT * FROM TABLE WHERE COLUMN LIKE '%query’

建議使用 2 或 3,速度會比較快
※對一個有百萬筆資料的table用 Full wildcard 會使資料庫出問題

四、NOT Operator(反向運算符號)

避免使用NOT在SQL裡面,用正向的方式會快很多。

盡量使用:

LIKE、IN、 EXIST、=

避免使用:

NOT LIKE、NOT IN、NOT EXIST、!=

五、Types(型態)

盡量使用最有效(最小的)資料型態。用太大的資料型態去存很小的資料是不必要甚至是危險的。用較小的資料型態可以得到比較小的table空間。

例如:
用MEDIUMINT通常就比用INT好,因為MEDIUMINT少了25%的空間,還有在儲存email 或是少數資料時VARCHAR還是比 longtext 好。

六、Limit The Result(限制回傳筆數)

若是table內有大量資料,一個簡單的query可能就會讓資料庫癱瘓。

例如:
SELECT * FROM TABLE

至少要限制一個範圍內:
SELECT * FROM TABLE
WHERE 1 LIMIT 10

或是
SELECT * FROM TABLE
LIMIT 10

七、In Sub Query(IN的子查詢)

我們常會用到IN的子查詢來查資料。

例如:
SELECT * FROM TABLE1
WHERE COLUMN IN (SELECT COLUMN FROM TABLE2)

這樣的SQL,DB會先處理內部查詢,再去做外面的查詢,會比較耗資源,應該寫成:
SELECT * FROM TABLE1, (SELECT COLUMN FROM TABLE2) AS tmptable
WHERE TABLE1.COLUMN = tmptable.COLUMN

效能會比較好一點

八、Utilize Union Instead Of OR(使用聯合,而不是OR)

用 or 會讓查詢速度降低,就算設index也沒太大的效果。

例如:
SELECT * FROM TABLE
WHERE COLUMN1 = 'VALUE' OR COLUMN2 = 'VALUE'

可以透過union改寫成:
SELECT * FROM TABLE
WHERE COLUMN1 = 'VALUE'
UNION
SELECT * FROM TABLE
WHERE COLUMN2 = 'VALUE'

效能會比較好