Ich baue eine Abflachung Abfrage für einige Daten und ich habe zu diesem Fremdschlüssel, der die Abfrage führt plötzlich von 0.031s läuft in 2.460 ausgeführt wird s. Ich analysierte die Abfrage und die Verknüpfung wird als ALL
Join mit der zusätzlichen Using where; Using join buffer (Block Nested Loop)
statt einer eq_ref
Join durchgeführt.MySql Join Typ Weirdness (mit "ALL" anstelle von "eq_ref")
In dem Bemühen, herauszufinden, was vor sich geht, habe ich eine Kopie der beiden Tabellen erstellt und sie auf das Nötigste reduziert. Die Tabellendefinitionen sind:
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
hat 5 Zeilen mit Namen. zz_submission
hat 5 Zeilen mit gültigen IDs von RC.
Wenn ich diese Abfrage der "Typ" für die Tabelle laufen r
ist all
:
explain SELECT
s.ID,
r.name
FROM zz_submission s
LEFT JOIN zz_rc r ON s.rcId = r.id
;
Wenn ich diese Abfrage ausführen "Typ" für die Tabelle r
ist eq_ref
:
explain SELECT
s.ID,
r.id
FROM zz_submission s
LEFT JOIN zz_rc r ON s.rcId = r.id
;
Warum wirkt sich die Auswahl der Spalte ID vs. Name in der Join-Tabelle auf den Join-Typ aus? Ich habe dies auf meiner ursprünglichen Abfrage getestet und es wird wieder in 0.031s ausgeführt.
Was kann ich tun, damit die Query den eq_ref-Join hier verwendet?
Sie zeigen nicht die EXPLAIN-Ausgabe, die Gesamtzahl der Zeilen. Ihre Frage fehlt Detail – Drew
Sie strippten sie zu sehr. Für ** 5 ** -Zeilen ist es schneller, die Tabelle zu durchsuchen, als einen beliebigen Index zu verwenden. –
Entschuldigung, ich habe die EXPLAIN-Ausgabe hinzugefügt. – William