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

MySQL med JOIN bruger ikke indeks

Jeg ved ikke, hvilken forskel du ser i dine tidligere og nuværende installationer, men serverens adfærd giver mening.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id )  ORDER BY  test_events.create_time DESC LIMIT 1; 

I denne forespørgsel har du ikke en where-klausul, men du henter kun én række. Og det er efter sortering efter create_time som tilfældigvis har et indeks. Og det indeks kan bruges til sortering. Men lad os se den anden forespørgsel.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id ) WHERE base = 314 ORDER BY  test_events.create_time DESC LIMIT 1

Du har ikke et indeks i basiskolonnen. Så der kan ikke bruges noget indeks på det. For at finde de relevante poster skal mysql lave en tabelscanning. Efter at have identificeret de relevante rækker, skal de sorteres. Men i dette tilfælde har forespørgselsplanlæggeren besluttet, at det bare ikke er det værd at bruge indekset på create_time

Jeg kan se flere problemer med din opsætning, den første er ikke at have og indeksere på base som allerede nævnt. Men hvorfor er base varchar? Du ser ud til at gemme heltal i den.

ALTER TABLE test_events
  ADD PRIMARY KEY (id),
  ADD KEY client (client),
  ADD KEY event_time (event_time),
  ADD KEY manager (manager),
  ADD KEY base_id (base_id),
  ADD KEY create_time (create_time);

Og at lave flere indekser som dette giver ikke meget mening i mysql. Det er fordi mysql kun kan bruge ét indeks pr. tabel til forespørgsler. Du ville være langt bedre stillet med et eller to indekser. Muligvis indekser med flere kolonner.

Jeg tror, ​​dit ideelle indeks ville indeholde både create_time og begivenhedsfelter



  1. php slet linksrækker fra mysql-databasen

  2. MariaDB INTERSECT Operator forklaret

  3. Identifikator for lang i Oracle

  4. MINUTE() Eksempler – MySQL