Jex’s Note

MySQL Index 解說

為什麼要建立索引:

適當的設定index可以有效的降低資料庫查詢的時間, 但這是以空間爭取時間的做法, 所以建立索引必須先考量到常被查詢的欄位

如果查詢時判斷多個欄位, 建立多組欄位的索引也要考量優先順序, 才能有效降低索引所佔用的資料庫空間

索引的規則:

假設有一組索引是uid+gid+ctime

  • where條件不分先後順序, 假設ctime先再來是uid及gid, 也是符合的
  • 這組索引的重要順序也是依你設定的順序為主, 假設你的索引是uid+ctime, 那麼這組索引只有uid對你有效
  • 如果條件是gid+ctime這組索引是沒有效用的, 因為這組索引是由uid先開始排
  • 換句話說條件為uid+uname的話, 這組索引至少也可以幫你減少搜尋uid的時間n 但uname沒在索引上, 所以mysql還是得一行一行找

使用 EXPLAIN 來檢查執行命令後索引的使用狀況

EXPLAIN SELECT *
FROM  `user_log`
WHERE uid =2
AND gid =2
AND ctime >0

結果:(只列出重要的)

key : uid+gid+ctime  (使用到的索引)
raw : 4              (查詢筆數)

參考來源:夯哥

排序(ORDER BY)

mysql 排序是按照該欄位的編碼, 例如 utf8_unicode_ci 就是按照 UTF8(unicode) 的順序去排 數 > 英 > 日 > 中 > 韓

也可以用 COLLATE 指定排序的編碼

utf8(unicode) table

不會使用到 index 的狀況 (innodb)

如果 where 多個已經有建 index 的欄位, 不會使用到 index

user_id = 'A01' or user_id = 'A02'
IN('A01','A02')

單個才會使用到 index

user_id = 'A01'
IN('A01')

欄位優化

IP 用 int unsigned 存

> echo ip2long('10.0.115.80');
> 167801680

Comments