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

брой за всяко присъединяване - оптимизация

За целите на оптимизация, добро правило е да се присъедините по-малко, а не повече. Всъщност трябва да се опитате да присъедините възможно най-малко редове с възможно най-малко редове. С всяко допълнително присъединяване ще умножите разходите, вместо да добавяте цена. Защото mysql по същество просто ще генерира голяма умножена матрица. Много от това обаче се оптимизира от индекси и други неща.

Но за да отговоря на въпроса ви:всъщност е възможно да се брои само с едно голямо присъединяване, като приемем, че масите имат уникални ключове и idalb е уникален ключ за албум. След това и само тогава можете да го направите подобно на вашия код:

select alb.titreAlb as "Titre",
       count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays",
       count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages",
       count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb

където PrimaryKeyFields означава полетата с първичен ключ на обединените таблици (трябва да ги потърсите).

Distinct ще премахне ефекта, който другите присъединявания имат върху броя. Но за съжаление, като цяло, distinct няма да премахне ефекта, който обединяванията имат върху цената.

Въпреки че, ако имате индекси, които покриват всички (idAlb + PrimaryKeyFields) полета на вашите таблици, това може да е също толкова бързо, колкото оригиналното решение (защото може да оптимизира distinct за да не правите сортиране) и ще се доближите до това, за което сте мислили (просто да преминете през всяка таблица/индекс веднъж). Но в нормален или най-лош случай сценарий, той трябва да работи по-лошо от разумно решение (като това на SlimGhost) - защото е съмнително, че ще намери оптималната стратегия. Но си поиграйте с него и проверете обясненията (и публикувайте констатациите), може би 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. HOUR() Примери – MySQL

  2. Използване на JDeveloper с MySQL база данни и Oracle Database на AWS RDS, част 2

  3. Как да преименувате таблица в MySQL

  4. Хибернация:Автоматично създаване/актуализиране на db таблиците въз основа на класове на обекти

  5. Множество ранга в една таблица