mysql单表查询in不等于如何选择_MySQL IN查询索引失效问题分析 - 从查询优化器如何基于查询成本选择查询方案入手...

本文查询优化器计算查询成本、选择查询方案是个人学习掘金小册子《MySQL 是怎样运行的:从根儿上理解 MySQL》后总结的,与原文可能有所不同,感兴趣的可以前往购买阅读。

https://juejin.im/book/6844733769996304392

一、问题介绍

线上环境有一张千万数据的表,新增了一个字段user_id,默认值为空字符串'',并为这个字段添加了普通二级索引。

简化后的表结构如下,这里我只插入了100万数据,user_id字段的值全是空字符串‘’

CREATE TABLE `test_table` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`user_id` char(32) NOT NULL DEFAULT '',

`version` int(10) unsigned NOT NULL DEFAULT '0',

`name` char(3) NOT NULL DEFAULT '',

PRIMARY KEY (`id`),

KEY `idx_user_id` (`user_id`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4

查询语句大致如下:

select * from test_table where user_id in ('aaa', 'bbb', 'ccc' ......);

代码上线后,出现了IN内的元素大于等于10个时就不走索引,全表扫描导致接口超时的问题。

fb45dc59c255

image.png

一眼看过去,明显是走索引效率更高的查询语句,为什么MySQL的查询优化器选择了全表扫描?

本文首先将介绍线上问题的这条查询语句,查询优化器是如何选择查询方案的,之后会在测试环境复现线上的问题,最后给出问题的解决方式。

二、查询优化器如何基于成本选择查询方案

在用explain查看select语句的执行计划时,是否有过以下疑问:

where条件明明可以走索引,为什么explain

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值