Ich habe folgende Self-Join-Abfrage:MySql - Self-Join - Full Table Scan (Kann nicht Index Scan)
SELECT A.id
FROM mytbl AS A
LEFT JOIN mytbl AS B
ON (A.lft BETWEEN B.lft AND B.rgt)
Die Abfrage ist ziemlich langsam, und nach bei dem Ausführungsplan der Suche erscheint die Ursache zu sein eine vollständige Tabelle Scan in der JOIN. Die Tabelle hat nur 500 Zeilen, und da ich vermute, dass dies das Problem ist, habe ich sie auf 100.000 Zeilen erhöht, um zu sehen, ob sie die Auswahl des Optimierers beeinflusst hat. Es tat nicht, mit 100k Zeilen war es immer noch eine vollständige Tabelle scannen.
Mein nächster Schritt war, um zu versuchen und Kraft-Indizes mit der folgenden Abfrage, aber die gleiche Situation ergibt sich, einen vollständigen Tabellenscan:
SELECT A.id
FROM categories_nested_set AS A
LEFT JOIN categories_nested_set AS B
FORCE INDEX (idx_lft, idx_rgt)
ON (A.lft BETWEEN B.lft AND B.rgt)
Alle Spalten (id, LFT, RGT) sind Ganzzahlen, alle sind indiziert.
Warum macht MySql hier einen vollständigen Tabellenscan?
Wie kann ich meine Abfrage ändern, um Indizes anstelle eines vollständigen Tabellenscan zu verwenden?
CREATE TABLE mytbl (lft int(11) NOT NULL DEFAULT '0',
rgt int(11) DEFAULT NULL,
id int(11) DEFAULT NULL,
category varchar(128) DEFAULT NULL,
PRIMARY KEY (lft),
UNIQUE KEY id (id),
UNIQUE KEY rgt (rgt),
KEY idx_lft (lft),
KEY idx_rgt (rgt)) ENGINE=InnoDB DEFAULT CHARSET=utf8
Dank
teilen sich die Ergebnisse der 'show create table xyz' für jede relevante xyz – Drew
Ergebnisse unter: ' TABLE mytbl CREATE ( lft int (11) NOT NULL DEFAULT '0', RGT int (11) NULL DEFAULT, ID int (11) NULL DEFAULT, Kategorie VARCHAR (128) DEFAULT NULL, PRIMARY KEY (LFT), UNIQUE Schlüssel-ID (id), EINZIGARTIGER SCHLÜSSEL rgt (rgt), SCHLÜSSEL idx_l ft (lft), KEY idx_rgt (rgt) ) ENGINE = InnoDB DEFAULT CHARSET = utf8' – mils
Ein 'PRIMARY KEY' ist ein' UNIQUE' Schlüssel ist ein 'KEY'. Also sind die zwei KEYs redundant und sollten entfernt werden. –