Ich habe eine Tabelle namens 'Artikel', das ungefähr so aussieht ...Optimierung many-to-many-Abfrage in MySQL
id | name
––––––––––––
1 | APPLES
2 | BANANAS
3 | ORANGES
4 | PEARS
... und eine Verknüpfungstabelle 'Paare' genannt Erstellen many-to-many-Beziehungen zwischen den Elementen ...
id | item1_id | item2_id
––––––––––––––––––––––––
1 | 1 | 2
2 | 1 | 4
3 | 2 | 3
4 | 2 | 4
5 | 4 | 3
ich habe die folgende Abfrage Gegenstände zu finden, die mit einem bestimmten Element gepaart ...
SELECT * FROM items i
WHERE
i.id IN (SELECT item1_id FROM pairs WHERE item2_id = 4)
OR
i.id IN (SELECT item2_id FROM pairs WHERE item1_id = 4)
Rückkehr so etwas wie ...
id | name
––––––––––––
1 | APPLES
3 | ORANGES
..., die die Arbeit erledigt, aber es läuft ziemlich langsam (mit einem kleinen Testdatenmenge von etwa 100 Artikeln, 1000 Paarungen es bereits über 75 ms ist unter).
Meine Frage ist - kann dies weiter optimiert werden, um es zu beschleunigen (z. B. mit Joins anstelle von verschachtelten Abfragen)?
Danke für jede Hilfe.
Das machte einen großen Unterschied. Die Ausführungszeit ging von ~ 74ms runter auf ~ 3ms! Ich habe noch nie zuvor Indizes verwendet, und hilfreich zu wissen, dass MySQL unterschiedlich geäußerte Abfragen ähnlich optimiert. Vielen Dank! :) – teadog
@steog Nur fallen Sie nicht in die Falle der Indizierung * alles *, erstellen Indizes [wo sie helfen] (http://stackoverflow.com/questions/5446124/mysql-why-not-index-every-field).PS Mit einem größeren Dataset möchten Sie vielleicht auch mit einem einzelnen mehrspaltigen Index für (item1_id, item2_id) im Vergleich zu den beiden hier beschriebenen einspaltigen Indizes experimentieren (ich würde nicht alle drei dieser Indizes gleichzeitig machen) Zeit, es sei denn, es gibt ein echtes Bedürfnis danach. –