當查詢語句中的多個查詢條件使用OR關鍵字進行連接時,只要OR連接的條件中有一個查詢條件沒有使用索引,MySQL就不會使用索引,而是對數據表進行全表掃描。也就是說,使用OR連接多個查詢條件,且每個查詢條件必須使用索引時,MySQL才會使用索引查詢數據。
如下表
--- show create table g_dict_item
CREATE TABLE `g_dict_item` (
`UUID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`CODE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`ITEM_NAME` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`VALID_MARK` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`REMARK` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`ITEM_CODE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`ITEM_ORDER` int DEFAULT NULL,
`BIG_TEXT` varchar(20000) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`UUID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
1、OR關聯字段有一個字段沒建索引
2、OR 關聯字段都建索引
添加索引:
ALTER TABLE `sakila`.`g_dict_item` ADD INDEX `idx_code`(`CODE`);
3、OR關聯三個字段,最后一個字段沒建索引
再添加一個OR
條件
4、使用 UNION ALL 對 OR 查詢進行優化
對OR
查詢,使用 union all
進行優化
1、
2、
總結:
遇到 OR 查詢盡量使用 UNION ALL 或者 IN 來代替。