由于分库分表的原因,和开发规定了不能使用表表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),