【发布时间】:2016-11-23 01:27:02
【问题描述】:
我正在为一些数据构建一个扁平化查询,我得到了这个外键,导致查询突然从 0.031 秒运行到 2.460 秒运行。我分析了查询,连接是作为ALL 连接完成的,带有额外的Using where; Using join buffer (Block Nested Loop),而不是eq_ref 连接。
为了弄清楚发生了什么,我复制了两张表并将它们精简到最低限度。表定义是:
CREATE TABLE `zz_submission` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rcId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_rcId` (`rcId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `zz_rc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
zz_rc 有 5 行名称。 zz_submission 有 5 行具有来自 RC 的有效 id。
当我运行这个查询时,表r 的“类型”是all:
explain SELECT
s.ID,
r.name
FROM zz_submission s
LEFT JOIN zz_rc r ON s.rcId = r.id
;
当我运行这个查询时,表r 的“类型”是eq_ref:
explain SELECT
s.ID,
r.id
FROM zz_submission s
LEFT JOIN zz_rc r ON s.rcId = r.id
;
为什么在连接表中选择 ID 与名称列会影响连接类型?我在原始查询中对此进行了测试,它再次切换回以 0.031 秒运行。
如何使查询在此处使用 eq_ref 连接?
【问题讨论】:
-
您没有显示解释输出,总行数。您的问题缺乏细节
-
你把它们剥离得太多了。对于 5 行,扫描表比使用任何索引都快。
-
对不起,我添加了解释输出。
标签: mysql join optimization