Mysql Index 和 Where 順序的關聯
我們假設我們有建立一個 table, 裡面有三個欄位,分別為 a
, b
, c
, 同時也針對這三個欄位建立 index idx_abc
,這種建法背後其實是同時建立三個 index, 類似 idx_a
, idx_ab
, idx_abc
, 這是時候我們分別用下面條件來查詢,那些會觸發 index?
因為我們的 index 建立順序是 abc 一起的複合 index, 所以要觸發這個 index, 裡面必須要 a
這個欄位,因為需要 index 的第一個欄位,因為 mysql 的 sql parse 有針對查詢做最佳化,當你的 where 條件第一個開始的不是 a
但後面有用到 a
, 這樣也是會用到 idx_abc
這個 index 來加數查詢
DROP TABLE IF EXISTS `xyz`;
CREATE TABLE `xyz` (
`a` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`b` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`c` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`d` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
INDEX `idx_abc`(`a`, `b`, `c`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
where a=1 and b=1 and c=3 (valid)
where a=1 and b=1 and c=3 (valid)
where c=1 and b=1 and a=1 (valid ==> 因為這邊有用到 a
)
where b=1 and c=1 (invalid ==> 因為沒有 a
)
where c=1 and b=1 (invalid ==> 因為沒有 a
)