2009-03-08 6 views
2

Tabelle hat etwa 8 Millionen Zeilen. Es gibt einen nicht eindeutigen Index für X.SELECT * FROM Tabelle WHERE x IN (... ein paar hundert Ints ...)

Zeigt Indizes an, in der Tabelle gibt es einen nicht eindeutigen Index für Schlüsselname X mit "seq_in_index" von 1, Sortierung A, Kardinalität 7850780, sub_part NULL, gepackt NULL, index_type BTREE.

Diese Abfrage kann 5 Sekunden dauern. Die Liste der Ints kommt von einem anderen System, und ich darf sie nicht in einer Tabelle speichern, da sie Freundschaften in einem sozialen Netzwerk darstellen.

Gibt es einen schnelleren Weg als eine massive IN-Anweisung?

Antwort

12

Sie können Ihre ID-Liste in eine temporäre Tabelle (oder eine Tabellenvariable, wenn MySql sie unterstützt) konvertieren und sich ihr anschließen.

Die Tabelle würde nur so lange leben wie die Abfrage, so dass Sie nicht wirklich speichern alles in einer Tabelle.

5

Sie könnten versuchen, sie in einem temporary table zu speichern. Diese Tabelle würde nicht dauerhaft in der Datenbank gespeichert werden und ich denke, dass der resultierende Join (vorausgesetzt, dass Sie auch die temporäre Tabelle indizieren) schneller wäre, da er in der Lage wäre, die Indizes parallel zu verarbeiten und keine Indexsuche durchzuführen für jeden int die IN-Klausel. Natürlich kann MySQL die IN-Klausel optimieren und dasselbe tun, wenn es weiß, dass es einen Index verwenden wird, so dass es Ihnen möglicherweise gar nichts bringt. Ich würde es versuchen und sehen, ob es schneller ist.

4

Wie von anderen vorgeschlagen, ist eine temporäre Tabelle die am besten geeignete Lösung.

Beachten Sie jedoch, dass abhängig von der Kardinalität und der Anzahl der Zeilen in Ihrer temporären Tabelle/in() - Bedingung der Optimierer möglicherweise auf einen sequenziellen Scan zurückgreifen kann, da sequenzielle Lesevorgänge viel schneller sein können von zufälligen sucht im index.

An dieser Stelle kann es angebracht sein, die Beziehungen neu zu gestalten.

+0

+1: Gute Punkte über den Optimierer und das Design –

+0

Ja, ich denke an Denormalisierung der Datenbank, so dass diese Abfrage nicht notwendig wäre. – Bemmu