mysql求不连续范围,Mysql优化(对索引进行查询不连续的查询)

由于分库分表的原因,和开发规定了不能使用表表JOIN 语句。因此,我们要将JOIN 语句的转化成使用IN 来做。如现在有表A(a_id, c_a)c_a有普通索引,表B(b_id, c_a) 这两个表要关联, 应该转化为以下步骤处理:

先查询B中的a_id

SELECT c_a FROM B WHERE xxx;

使用IN 查询A 表

SELECT a_id, ... FROM A WHERE c_a IN(在1 中查出来的c_a)

场景

现在表的数据量有800万。

一般的使用语句是:

SELECT * FROM A WHERE c_a IN(955555, 955556, 955557, 955558, 955559);

上面语句会执行的很快,知道使用explain 的都明白这样一般都是会使用索引的,并且是所有范围扫描。

MySQL不会从1 开始扫描800万,而是从555555 扫描到555559(只要扫描5行数据)。

在一般情况下是没有什么问题的。但是如果IN 里面的数据是不连续的就有很大问题了。创建表结构语句

CREATE TABLE t(

id INT unsigned NOT NULL AUTO_INCREMENT,

cid INT unsigned NOT NULL DEFAULT 0,

c1 V ARCHAR(50) NOT NULL DEFAULT '',

c2 V ARCHAR(50) NOT NULL DEFAULT '',

c3 V ARCHAR(50) NOT NULL DEFAULT '',

c4 V ARCHAR(50) NOT NULL DEFAULT '',

c5 V ARCHAR(50) NOT NULL DEFAULT '',

c6 V ARCHAR(50) NOT NULL DEFAULT '',

PRIMARY KEY(id),

INDEX idx$cid(cid)

);

INSERT INTO t V ALUES(

NULL,

FLOOR(RAND() * 1000000),

REPEAT('a', 50),

REPEAT('a', 50),

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值