Ich habe eine Abfrage mit einer langen Liste (> 2000 ids) in einem WHERE IN-Klausel in MySQL (InnoDB):Mysql: Warum ist in diesem Fall viel schneller als JOIN?
SELECT id
FROM table
WHERE user_id IN ('list of >2000 ids')
ich dies wie dies durch die Verwendung eines INNER JOIN anstelle des bei zu optimieren versucht (beide IDs und die user_id verwenden, um einen Index):
SELECT table.id
FROM table
INNER JOIN users ON table.user_id = users.id WHERE users.type = 1
jedoch überraschenderweise die erste Abfrage ist viel schneller (um den Faktor 5 bis 6). Warum ist das der Fall? Könnte es sein, dass die zweite Abfrage die erste übertrifft, wenn die Anzahl der IDs in der WHERE-Klausel viel größer wird?
Führen Sie 'explain select ...' aus, um den Plan der Abfragen zu erhalten. –
Erstens, vielleicht users.type hat keinen Index? Zweitens, Join ist eine teure Sache, weil es alle Zeilen scannen und Tabellen verbinden muss und dann Lookup durchführen. In der ersten Abfrage Sie sofort Lookup – Andrew
Beachten Sie auch, dass, wie viel Sie passen in die IN-Klausel hängt von max_allowed_packet – e4c5