sql >> Database >  >> RDS >> Mysql

MySQL zijn mijn indexen goed?

Schrijf de vraag op deze manier:

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'

Geef niet op welke indexen moeten worden gebruikt.

Beginnend met de WHERE clausule, ziet het er zo uit misschien handig zijn:INDEX(status) . Maar aangezien "status" klinkt als een "vlag" met een lage kardinaliteit, kan de optimizer mogelijk besluit de index te negeren en gewoon een tabelscan uit te voeren. Dit is oké. Het is OK omdat het sneller is om een ​​tabelscan uit te voeren dan tussen een index en de gegevens te stuiteren, wanneer de index niet erg selectief is. Laat de beslissing in ieder geval over aan de Optimizer.

Nu het te maken heeft met orders , het moet JOIN aan users . De enige manier om dat te doen is door een index te hebben op id . Die naam ("id") impliceert dat het de PRIMARY KEY . kan zijn , is het? (Gelieve SHOW CREATE TABLE op te geven .)

Index kookboek

De andere vraag die u noemde, moet worden geschreven

SELECT * FROM users WHERE id=33

En, zoals reeds besproken, de index (PRIMARY KEY ?) op id is het juiste ding.

Er is geen voordeel (voor de gegeven SELECTs , tenminste) voor INDEX(status, id_user) . Uw selectie bevat alle kolommen (* ); het had alleen id_user . opgehaald , dan zou zo'n index "dekkend" zijn en enig voordeel hebben.




  1. Python:tuple converteren naar door komma's gescheiden String

  2. Alle id's opnemen in ActiveRecord-query

  3. Is er een limiet voor de door komma's gescheiden tekenreeks in find_in_set in mysql-query?

  4. MySQL kopieer een gebruiker