sql >> Databasteknik >  >> RDS >> Mysql

MySQL med JOIN använder inte index

Jag vet inte vilken skillnad du ser i dina tidigare och nuvarande installationer men serverns beteende är vettigt.

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 den här frågan har du ingen where-klausul utan du hämtar bara en rad. Och det är efter sortering efter create_time som råkar ha ett index. Och det indexet kan användas för sortering. Men låt oss se den andra frågan.

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 inget index i baskolumnen. Så inget index kan användas på det. För att hitta de relevanta posterna måste mysql göra en tabellskanning. Efter att ha identifierat de relevanta raderna måste de sorteras. Men i det här fallet har frågeplaneraren beslutat att det helt enkelt inte är värt det att använda indexet på create_time

Jag ser flera problem med din installation, det första är att inte ha och indexera på base som redan nämnts. Men varför är bas varchar? Du verkar lagra 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);

Och att göra flera index som detta är inte mycket meningsfullt i mysql. Det beror på att mysql bara kan använda ett index per tabell för frågor. Du skulle vara mycket bättre med ett eller två index. Eventuellt index med flera kolumner.

Jag tror att ditt ideala index skulle innehålla både create_time och händelsefält



  1. C# -- Hämta data från MySQL och beställa dem på sidor utan DataGridView

  2. Kopiera data mellan olika databaser (båda stöds jdbc)

  3. Oracle sql merge för att infoga och ta bort men inte uppdatera

  4. Hur skriver man ut resultatet på en annan rad med SQL-fråga?