php
  • mysql
  • performance
  • 2012-03-29 11 views 29 likes 
    29

    Questa è una domanda piuttosto semplice e presumo che la risposta sia "Non importa", ma devo chiedere comunque ...Prestazioni MySQL - Clausola "IN" vs. Equals (=) per un valore singolo

    ho una dichiarazione di sql generica costruito in PHP:

    $sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')'; 
    

    Supponendo controlli di validità precedenti ($object_ids è un array con almeno 1 articolo e tutti i valori numerici), devo fare la seguente, invece?

    if(count($object_ids) == 1) { 
        $sql = 'SELECT * FROM `users` WHERE `id` = ' . array_shift($object_ids); 
    } else { 
        $sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')'; 
    } 
    

    O è il sovraccarico di controllo count($object_ids) non vale quello che sarebbe stato salvato nell'istruzione SQL reale (se non del tutto)?

    +0

    Hai risposto alla tua domanda :) non importa. È anche più facile usare 'implode' senza controllare la dimensione dell'array. –

    +1

    @ N.B. Qualcuno ti ha mai detto che il tuo nome è perfetto per i commenti: P – mellamokb

    +0

    @mellamokb - ora qualcuno ha fatto :) –

    risposta

    14

    Nessuno dei due ha importanza nella grande portata delle cose. La latenza della rete nella comunicazione con il database supererà di gran lunga l'overhead count($object_ids) o l'overhead = rispetto allo IN. Chiamerei questo un caso di ottimizzazione prematura.

    È necessario eseguire il profilo e caricare il test dell'applicazione per sapere dove sono i veri e propri colli di bottiglia.

    +0

    Grazie, solo bisogno di qualche rassicurazione – JudRoman

    +0

    Questo in realtà non ha risposto alla domanda !! –

    23

    Non c'è alcuna differenza tra le istruzioni MySQL e l'ottimizzatore MySQL trasformerà IN in = quando IN è solo un elemento. Non preoccuparti

    +4

    Potresti richiamare alcune informazioni ufficiali MySQL per confermare la tua affermazione? Sei completamente sicuro che l'ottimizzatore MySQL lo trasformi come hai spiegato? – Delmo

    +2

    Non è vero, eseguo query con statement statement e screenshot postati come risposta – mes

    3

    immagino che internamente mysql tratteranno la query IN (6) esattamente come una query = 6 quindi non c'è bisogno di preoccuparsi (questo è chiamato l'ottimizzazione prematura tra l'altro)

    7

    Eseguire le due query con una dichiarazione spiegare. Questo ti mostrerà cosa sta facendo MySQL. Ti concentri sull'ottimizzazione MySQL dovrebbe essere su ciò che MySQL sta facendo internamente alla query. Cercare di ottimizzare quale query viene eseguita è un po 'prematuro.

    Entrambe queste query potrebbero essere terribili in termini di prestazioni se non esiste un indice, ad esempio. La dichiarazione EXPLAIN di MySQL è d'oro qui. Pertanto, quando si arriva a una query in esecuzione lenta, l'istruzione EXPLAIN ti mostrerà il motivo.

    0

    corro query con spiegare dichiarazione ed ecco i risultati enter image description here

    E 'evidente che "uguale" operatore è migliore, la scansione 13 di fila, e "IN" analizza tutti i file

    +1

    La query ha una sottoquery quindi non è necessariamente un'indicazione dell'ottimizzazione di 'IN' con un elemento – Vadim

    35

    La maggior parte del altre risposte non forniscono nulla di conclusivo, solo speculazioni. Quindi, in base allo good advice from @Namphibian's answer, ho eseguito uno EXPLAIN su alcune query simili a quelle dell'OP.

    I risultati sono di seguito:


    EXPLAIN per una query con = 1:

    Explain for a query with <code>= 1</code>


    EXPLAIN per una query con IN(1):

    Explain for a query with <code>IN(1)</code>


    EXPLAIN per una query con IN(1,2,3):

    Explain for a query with <code>IN(1,2,3)</code>


    Come si può vedere, MySQL non ottimizzare IN(1) ad essere lo stesso di = 1 in questo tipo di query. @mes's answer sembra indicare che questo potrebbe non essere sempre il caso con query più complesse, tuttavia.

    Quindi, per coloro che erano troppo pigri per eseguire lo EXPLAIN loro stessi, ora lo sai. E sì, potresti voler eseguire lo EXPLAIN sulla tua query per assicurarti che sia gestito in questo modo. :-)

    Problemi correlati