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

Защо тази INNER JOIN/ORDER BY mysql заявка е толкова бавна?

(Предполагам, че сте искали да въведете ids.customer_id = customer.customer_id а не customer_ids.customer_id)

Без ORDER BY mysql грабна първите 10 идентификатора от тип 10 (индексирани), потърси клиента за тях и беше готово. (Имайте предвид, че ЛЯВОТО СЪЕДИНЯВАНЕ тук наистина е ВЪТРЕШНО СЪЕДИНЯВАНЕ, тъй като условията за свързване ще важат само за редове, които имат съвпадение и в двете таблици)

С ORDER BY mysql вероятно извлича всички type=10 клиенти, след което ги сортира по име, за да намери първите 10.

Можете да ускорите това, като денормализирате таблицата на клиентите (копирате типа в записа на клиента) или създадете таблица за съпоставяне, която да съдържа customer_id, name, type кортежи. И в двата случая добавете индекс към (type, name) . Ако използвате таблицата за съпоставяне, използвайте я, за да направите 3-посочно свързване с клиенти и идентификатори.

Ако тип=10 е сравнително често срещан, можете също така да принудите заявката да обхожда таблицата с клиенти по име и да проверява типа за всеки с STRAIGHT JOIN. Няма да е толкова бързо като съставен индекс, но ще бъде по-бързо от изтеглянето на всички съвпадения.

И както е предложено по-горе, изпълнете EXPLAIN на вашата заявка, за да видите плана на заявката, който mysql използва.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP:брояч за харесване/нехаресване

  2. Грешка в MySQL заявката с CASE и INNER JOIN

  3. Превърнете една дълга колона на таблицата в таблица с множество колони

  4. как да създадете db mysql с sqlalchemy

  5. java mysql подготвено изявление