我正在爲某些數據構建扁平化查詢,並且我得到了導致查詢突然從0.031s運行到2.460中運行的這個外鍵秒。我分析了查詢,並且正在完成連接,因爲ALL
加入了額外的Using where; Using join buffer (Block Nested Loop)
而不是eq_ref
連接。MySql加入類型古怪(使用「ALL」而不是「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 vs Name列會影響連接類型?我在原始查詢中測試了它,並再次切換回0.031s。
我能做些什麼來使查詢在這裏使用eq_ref join?
您沒有顯示解釋輸出總計行數。你的問題缺乏細節 – Drew
你剝奪了他們太多。對於** 5 **行,掃描表比使用任何索引要快。 –
對不起,我添加了解釋輸出。 – William