Seleziona ... dove foo_id in (seleziona ID da ...) Efficienza [chiuso
-
27-10-2019 - |
Domanda
i) tra questi due che uno è più efficiente:
Select A.* from A, B where A.b_id = B.id
o
Select A.* from A where A.b_id in (select id from B);
ii) come fa Select A.* from A where A.b_id in (select id from B);
Lavora davvero? È tradotto internamente in qualcosa di simile Select A.* from A, B where A.b_id = B.id
o è (select id from B)
valutato per ogni riga di a?
Soluzione
Puoi controllare questo breve articolo:http://www.mysqlperformanceblog.com/2010/10/25/mysql-limitations-part-3-subqueries/
Altri suggerimenti
Questo è più efficiente:
Select A.* from A, B where A.b_id = B.id
Sì, Select A.* from A where A.b_id in (select id from B)
lavori.
E, no, (select id from B)
non viene valutato per ogni riga. Viene valutato solo una volta.
Normalmente, i join sono più veloci dell'uso del IN
operatore.
Non sono sicuro da dove provengano quel tipo di falsi join, ma dovresti unirti alle tabelle usando ON
, non una massa di dove è alla fine.
SELECT A.*
FROM A
INNER JOIN B ON (A.b_id = B.id)
Dipende da vari fattori, tra cui la versione MySQL, le dimensioni delle tabelle, l'esistenza di indici, ecc.
Dovresti provare a eseguire EXPLAIN ...
, o anche meglio se supportato, EXPLAIN EXTENDED ...
seguito da SHOW WARNIGS;
Per cercare di capire cosa sta facendo MySQL.