Ich habe eine MySQL 5.1 InnoDB-Tabelle (customers
) mit folgenden Struktur:schneller Weg Sätze in MySQL verwendet
int record_id (PRIMARY KEY)
int user_id (ALLOW NULL)
varchar[11] postcode (ALLOW NULL)
varchar[30] region (ALLOW NULL)
..
..
..
Es gibt ungefähr 7 Millionen Zeilen in der Tabelle.
SELECT * FROM customers WHERE user_id IN (32343, 45676, 12345, 98765, 66010, ...
in der aktuellen Abfrage, die derzeit über 560 user_id
s ist in der IN
Klausel: Derzeit wird die Tabelle wie folgt abgefragt werden. Bei mehreren Millionen Datensätzen in der Tabelle ist diese Abfrage langsam!
Es gibt sekundäre Indizes auf der Tabelle, von denen die erste auf user_id
selbst, was ich dachte, würde helfen.
Ich weiß, dass SELECT(*)
A Bad Thing ist und dies wird auf die vollständige Liste der erforderlichen Felder erweitert werden. Die oben nicht aufgeführten Felder sind jedoch int
s und double
s. Es gibt weitere 50 von denen zurückgegeben werden, aber sie sind für den Bericht benötigt.
Ich kann mir vorstellen, es gibt eine viel bessere Möglichkeit, auf die Daten für die user_id
s zuzugreifen, aber ich kann nicht denken, wie es geht. Meine erste Reaktion ist es, die ALLOW NULL
auf dem user_id
Feld zu entfernen, wie ich NULL
Behandlung verstehen, verlangsamt Abfragen?
Ich wäre sehr dankbar, wenn Sie mich in eine effizientere Richtung als die Verwendung der IN ()
Methode zeigen könnten.
EDIT Ran ERKLÄREN, die sagte:
select_type = SIMPLE
table = customers
type = range
possible_keys = userid_idx
key = userid_idx
key_len = 5
ref = (NULL)
rows = 637640
Extra = Using where
tut diese Hilfe?
Würden Sie bitte eine "erklären" Abfrage ausführen und die Ergebnisse veröffentlichen? – shylent
IN() ist am effizientesten. Das Erstellen einer Spalte NULLable macht im allgemeinen Fall wenig Unterschied (außer wenn Sie einen Ersatzwert anstelle der richtigen NULL verwenden, in diesem Fall ist es vorteilhaft) – MarkR