exists中存在关联查询,且关联条件中存在or,为什么会导致索引失效

下面是表结构

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条件两边都有索引,不是应该会走索引吗,求大神解达!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿伟来了an

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值