下面是表结构
CREATE TABLE `single_table` (
`id` int NOT NULL AUTO_INCREMENT,
`key1` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`key2` int DEFAULT NULL,
`key3` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`key_part1` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`key_part2` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`key_part3` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`common_field` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`city` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_key2` (`key2`),
KEY `idx_key1` (`key1`),
KEY `idx_key3` (`key3`),
KEY `idx_key_part` (`key_part1`,`key_part2`,`key_part3`),
KEY `idx_city` (`city`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=42001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `single_table2` (
`id` int NOT NULL AUTO_INCREMENT,
`key1` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`key2` int DEFAULT NULL,
`key3` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`key_part1` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`key_part2` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`key_part3` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`common_field` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`city` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_key2` (`key2`),
KEY `idx_key1` (`key1`),
KEY `idx_key3` (`key3`),
KEY `idx_key_part` (`key_part1`,`key_part2`,`key_part3`),
KEY `idx_city` (`city`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=27001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
以上两张表结构相同,索引相同
下面的查询语句没用到索引
EXPLAIN SELECT
a.key1,
key2,
key3,
key_part1
FROM
single_table a
WHERE
EXISTS ( SELECT 1 FROM single_table2 b WHERE ( a.key1 = b.key1 OR a.key3 = b.key1 ) )
把or改为and就会用到key1的索引
EXPLAIN SELECT
a.key1,
key2,
key3,
key_part1
FROM
single_table a
WHERE
EXISTS ( SELECT 1 FROM single_table2 b WHERE ( a.key1 = b.key1 and a.key3 = b.key1 ) )
正常来说,用or的时候,or条件两边都有索引,不是应该会走索引吗,求大神解达!!!!