幫助 storage engine 快速獲取資料的資料結構
在MySQL 多使用 B+tree
find 8 step1: 1<= 8 < 18 step2: 6 <= 8 < 12 steps: 6, "8" 10 finish "1", 18, 36 / | / | / | 1, "6", 12 18, 24, 30 / | \ / | \ 1 6 12 18 24 .......... 3 "8" 15 20 26 5 10 17 22 28
單字段: 單直索引
EX: ALTER TABLE member ADD INDEX email_index (email);
多字段: 複合索引
EX: ALTER TABLE member ADD INDEX email_tel_index (email, tel);
在主鍵上進行索引: 主鍵索引
在非主鍵上進行索引: 輔助索引(二級索引)
所以
B+tree 會排序索引,所以如果 where condition 無法取得連續範圍資料則會失效
對索引左或左右模糊
// ex: SELECT * FROM user WHERE name like "%ron"; SELECT * FROM user WHERE name like "%ro%";
對索引使用函數
//ex: SELECT * FROM user WHERE length(name) = 6; // MySQL 8.0 後可以使用函式索引 ALTER TABLE user ADD KEY index_name_langth ((length(name)));
對索引進行計算
//ex: SELECT * FROM user WHERE id + 1 = 6;
對索引進行隱式類型轉換
//ex: SELECT * FROM user WHERE name = 123; // MySQL 的資料類型轉換規則是將string轉成number在進行比較
複合索引非最左匹配
// ex: // index (a, b,c) WHERE a = 6 and b = 6 and c = 6 WHERE a = 6 and b = 6 WHERE a = 6 // 以上都可以 WHERE b = 6 and c = 6 WHERE b = 6 // 以上都會進行全表搜
OR
WHERE condition1 OR condition2 因為需 condition1 和 condition2 都成立 所以 如果 condition2 是沒有索引的話則失效