Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Macht es Sinn, MySQL LIMIT 1 zu verwenden, wenn indizierte/eindeutige Felder abgefragt werden?

Ist es sinnvoll, MySQL „LIMIT 1“ zu verwenden, wenn Primärschlüssel/eindeutige Felder abgefragt werden?

Es ist nicht empfehlenswert, LIMIT 1 zu verwenden beim Abfragen mit Filterkriterien, die entweder gegen einen Primärschlüssel oder eine eindeutige Einschränkung verstoßen. Ein Primärschlüssel oder eine eindeutige Einschränkung bedeutet, dass es in der Tabelle nur eine Zeile/einen Datensatz mit diesem Wert gibt, es wird immer nur eine Zeile/ein Datensatz zurückgegeben. Es ist widersprüchlich, LIMIT 1 zu haben auf einem primären Schlüssel/eindeutigen Feld – jemand, der den Code später verwaltet, könnte die Wichtigkeit missverstehen und Ihren Code an zweiter Stelle erraten.

Aber der ultimative Indikator ist der Erklärungsplan:

explain SELECT t.name FROM USERS t WHERE t.userid = 4

...gibt zurück:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |

...und:

explain SELECT t.name FROM USERS t WHERE t.userid = 4 LIMIT 1

...gibt zurück:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |

Schlussfolgerung

Kein Unterschied, keine Notwendigkeit. Es scheint in diesem Fall optimiert zu sein (nur Suche gegen den Primärschlüssel).

Was ist mit einem indizierten Feld?

Ein indiziertes Feld garantiert nicht die Eindeutigkeit des gefilterten Werts, es kann mehr als ein Vorkommen geben. Also LIMIT 1 würde Sinn machen, vorausgesetzt, Sie möchten eine Zeile zurückgeben.