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

    Das ist eine ziemlich einfache Frage und ich gehe davon aus, dass die Antwort "Es ist egal", aber ich muss trotzdem fragen ...MySQL Performance - "IN" -Klausel vs. Gleich (=) für einen einzelnen Wert

    ich habe eine generische sQL-Anweisung in PHP gebaut:

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

    vor Gültigkeitsprüfungen Unter der Annahme ($object_ids ist ein Array mit mindestens 1 Punkt und alle numerischen Werten), soll ich folgende stattdessen tun?

    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) . ')'; 
    } 
    

    Oder ist der Aufwand für die Überprüfung count($object_ids) nicht wert, was in der aktuellen SQL-Anweisung gespeichert werden würde (wenn überhaupt)?

    +0

    Sie haben Ihre Frage beantwortet :) es spielt keine Rolle. Es ist auch einfacher, 'implode' zu ​​verwenden, ohne die Größe des Arrays zu überprüfen. –

    +1

    @ N.B. Hat dir jemals jemand gesagt, dass dein Name perfekt für Kommentare ist: P – mellamokb

    +0

    @mellamokb - jetzt hat jemand :) –

    Antwort

    14

    Keine von beiden wirklich wichtig in dem großen Umfang der Dinge. Die Netzwerklatenz bei der Kommunikation mit der Datenbank wird die count($object_ids) Overhead- oder die vs IN Overhead bei weitem überwiegen. Ich würde dies einen Fall vorzeitiger Optimierung nennen.

    Sie sollten Ihre Anwendung profilieren und laden, um zu erfahren, wo die echten Engpässe sind.

    +0

    Danke, brauchte nur ein wenig Sicherheit – JudRoman

    +0

    Das hat nicht wirklich die Frage beantwortet !! –

    23

    Es gibt keinen Unterschied zwischen den MySQL-Anweisungen, und der MySQL-Optimierer wandelt das IN in das = um, wenn IN nur ein Element ist. Mach dir keine Sorgen.

    +4

    Können Sie einige offizielle MySQL-Informationen abrufen, um Ihre Behauptung zu bestätigen? Sind Sie absolut sicher, dass MySQL Optimizer es so umsetzt, wie Sie es erklärt haben? – Delmo

    +2

    Es ist nicht wahr, ich führe Abfrage mit EXPLAIN-Anweisung und geposteten Screenshots als Antwort – mes

    3

    Ich stelle mir vor, dass intern mysql die IN (6) Abfrage genau als = 6 Abfrage behandeln wird, so gibt es keine Notwendigkeit, zu stören (dies ist eine vorzeitige Optimierung durch die Art und Weise genannt)

    7

    Führen Sie die zwei Abfragen mit einer Aussage erklären. Dies zeigt Ihnen, was MySQL tut. Sie konzentrieren sich auf MySQL-Optimierung sollte auf was MySQL mit der Abfrage intern tun. Zu optimieren, welche Abfrage ausgeführt wird, ist etwas verfrüht.

    Beide Abfragen können in der Leistung schrecklich sein, wenn es keinen Index zum Beispiel gibt. Die EXPLAIN-Anweisung von MySQL ist hier Gold. Wenn Sie also zu einer Abfrage kommen, die langsam läuft, zeigt Ihnen die EXPLAIN-Anweisung, warum.

    0

    Ich betreibe Abfrage mit Aussage erklären und hier sind die Ergebnisse enter image description here

    Es ist offensichtlich, dass „Equals“ Operator besser ist, es 13 Zeile abtastet und „IN“ scannt alle Reihen

    +1

    Ihre Abfrage hat eine Unterabfrage, also ist es nicht unbedingt ein Hinweis auf die Optimierung von 'IN' mit einem Element – Vadim

    35

    der meisten andere Antworten liefern nichts Schlüssiges, nur Spekulation. Also, basierend auf der good advice from @Namphibian's answer, lief ich eine EXPLAIN auf einige Abfragen ähnlich denen in der OP.

    Die Ergebnisse sind unten:


    EXPLAIN für eine Abfrage mit = 1:

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


    EXPLAIN für eine Abfrage mit IN(1):

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


    EXPLAIN für eine Abfrage mit IN(1,2,3):

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


    Wie Sie sehen können, hat MySQL IN(1) optimiert die gleichen wie = 1 in dieser Art von Abfrage zu sein. @mes's answer scheint darauf hinzuweisen, dass dies bei komplexeren Abfragen jedoch nicht immer der Fall ist.

    Also, für diejenigen, die zu faul waren, die EXPLAIN selbst zu laufen, jetzt wissen Sie. Und ja, möglicherweise möchten Sie die EXPLAIN auf Ihre eigene Abfrage ausführen, um sicherzustellen, dass es auf diese Weise behandelt wird. :-)

    Verwandte Themen