設為首頁

收藏本站

導覽首頁 | 新登場    ◇聯盟溫泉 | 民宿 | 人力銀行 | 女性 |

類型:mysql_article

MySQL 索引觀念

索引的目的,在於避免做 table full scan。
假設你的 table 有一萬筆,這欄位 1 與 2 各五千筆,在建立了 b-tree 索引之後,1 與 2 會被分成兩堆。當你下 WHERE ON = 1 時,只需要五千次 fetch 就能抓到所有的 ON=1 資料 (因為第一次 fetch 就會往 1 的葉節點去,已經去掉五千筆 ON=2 的資料不用 check。)
如果不建索引,那麼不管要找 ON=1 或 N=2 通通都得掃過一萬筆。講到這裡,你就知道索引該不該建了。
更何況建了索引,索引資料比較少,mysql 可以一次 load 進記憶體處理。沒有索引,那意謂著該 table 有多大,你這個 WHERE ON =1 的指令就要讀過那麼多的資料,效能之慘,可想而知。

既然 where 用到,那麼不就是應該要遵循第1點,為它建立索引?

如果你的範圍放在 mysql,那分享一些索引概念:
1. 你的第1點是對的,應該說 WHERE 或 ORDER 有索引會更好,但沒索引一樣能做,只是比較差。
2. 如果 WHERE 或 ORDER 用到複合條件,那麼就要建複合索引。如
... where A=AA and B=BB 就要建一個 index(A,B) 的索引。若沒有 AB 索引,但有 A 索引,mysql 會使用,但若只有 B 索引,則 mysql 不會使用。
3. where 的順序應該跟索引順序一致。如上題所例,如果有 BA 索引,mysql 是不會使用的。因為AB 與 BA 索引建出來的順序完全不一樣,mysql 並不會因為你有 BA 索引就自動把 where 條件互換。
4. 若對欄位做運算,則該欄位即使有索引也不用。比如『where COL-3 = 10』就不用 COL 索引,但『where COL = 13』就會用。
5. mysql 主要有四種索引,primary key、unique key、index key、full text searching key。
PK 是唯一且不能是NULL的欄位所組成;UK 是唯一且可以是 NULL 的欄位所組成;IK 是不唯一且可以是 NULL的欄位所組成。FK 則是字元型態且允許 NULL 的欄位所組成。
6. my.cnf 中的 key_buffer 值能夠把所有索引 (*.MYI) 容納進去最好。
7. 可以在 SQL 指令前加上 explain 來顯示該 SQL 是否用到索引。

104休閒信箱 2.3.0 © 104mm.com 2001 - 2018. 您尚未登錄
Page generated in 0.08106995 seconds with 3 Queries