sql >> Database >  >> RDS >> Mysql

Heeft het zin om MySQL LIMIT 1 te gebruiken bij het opvragen van een geïndexeerd/uniek veld?

Heeft het enig zin om MySQL "LIMIT 1" te gebruiken bij het opvragen van een primaire sleutel/uniek veld?

Het is geen goede gewoonte om LIMIT 1 . te gebruiken bij query's met filtercriteria die tegen een primaire sleutel of een unieke beperking zijn. Een primaire sleutel, of unieke beperking, betekent dat er slechts één rij/record in de tabel is met die waarde, er zal slechts één rij/record ooit worden geretourneerd. Het is tegenstrijdig om LIMIT 1 . te hebben op een primaire sleutel/uniek veld--iemand die de code later onderhoudt, kan zich vergissen in het belang en vervolgens uw code raden.

Maar de ultieme indicator is het uitlegplan:

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

...retourneert:

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

...en:

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

...retourneert:

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

Conclusie

Geen verschil, geen noodzaak. Het lijkt in dit geval te zijn geoptimaliseerd (alleen zoeken op de primaire sleutel).

Hoe zit het met een geïndexeerd veld?

Een geïndexeerd veld garandeert niet de uniciteit van de waarde die wordt gefilterd, er kan meer dan één exemplaar zijn. Dus LIMIT 1 zou logisch zijn, ervan uitgaande dat u één rij wilt retourneren.



  1. Hoe schrijf je een hoofdletterongevoelige query voor zowel MySQL als Postgres?

  2. Mysql - Hoe bestel ik resultaten door afwisselende (1,2,3, 1, 2, 3, 1, 2, 3,) rijen, is dat mogelijk?

  3. Kun je een if-statement toevoegen in ORDER BY?

  4. Hoe kan ik mijn laatste verwijderopdracht in MySQL terugdraaien?