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)