Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL с JOIN не използва индекс

Не знам разликата, която виждате в предишните и текущите си инсталации, но поведението на сървърите има смисъл.

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; 

В тази заявка нямате клауза where, но извличате само един ред. И това е след сортиране по create_time което случайно има индекс. И този индекс може да се използва за сортиране. Но нека да видим второто запитване.

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

Нямате индекс в основната колона. Така че не може да се използва индекс за това. За да намери съответните записи, mysql трябва да направи сканиране на таблица. След идентифициране на съответните редове, те трябва да бъдат сортирани. Но в този случай програмата за планиране на заявки е решила, че просто не си струва да се използва индексът на create_time

Виждам няколко проблема с вашата настройка, като първият е липсата на индекс на base както вече беше споменато. Но защо базата е varchar? Изглежда, че съхранявате цели числа в него.

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);

И създаването на множество индекси като този няма много смисъл в mysql. Това е така, защото mysql може да използва само един индекс на таблица за заявки. Ще бъдете много по-добре с един или два индекса. Вероятно многоколонни индекси.

Мисля, че вашият идеален индекс би съдържал полета create_time и събитие



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Йерархична база данни на MySQL Closure Table - Как да извадите информация в правилния ред

  2. Безопасно ли е да съхранявате пароли в обикновен текст в MySQL *временно*?

  3. Масата е маркирана като катастрофирала и трябва да бъде поправена

  4. Oracle Database Link - MySQL еквивалент?

  5. MySQL ограничение от низходящ ред