sql >> Database teknologi >  >> RDS >> Mysql

MySQL er mine indekser gode?

Skriv forespørgslen på denne måde:

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

Angiv ikke, hvilke indekser der skal bruges.

Startende med WHERE klausul, ser det ud til, at dette kan være nyttig:INDEX(status) . Men da "status" lyder som et "flag" med lav kardinalitet, kan optimeringsværktøjet beslutte at ignorere indekset og blot lave en tabelscanning. Det er i orden. Det er OK, fordi det er hurtigere at lave en tabelscanning end at hoppe mellem et indeks og dataene, når indekset ikke er særlig selektivt. Under alle omstændigheder skal du lade beslutningen være op til Optimizer.

Nu hvor det beskæftiger sig med orders , den skal JOIN til users . Den eneste måde at gøre det på er at have et indeks på id . Dette navn ("id") antyder, at det kan være den PRIMARY KEY , er det? (Angiv venligst SHOW CREATE TABLE .)

Indeks-kogebog

Den anden forespørgsel, du nævnte, skal skrives

SELECT * FROM users WHERE id=33

Og, som allerede diskuteret, indekset (PRIMARY KEY ?) på id er det rigtige.

Der er ingen fordel (for de givne SELECTs). , mindst) for INDEX(status, id_user) . Dit valg inkluderer alle kolonner (* ); det havde kun hentet id_user , så ville et sådant indeks være "dækkende" og have en vis fordel.




  1. udefineret metode, mens du bruger form_for i Ny controller-metode

  2. hvordan man dropper partition uden at tabe data i MySQL?

  3. Hvordan flytter jeg en tabel ind i et skema i T-SQL

  4. Filtrerede indekser og INKLUDEREDE kolonner