In InnoDB bevat elke index impliciet de primaire sleutel.
Het uitlegplan laat zien dat index IDX_NOME
wordt gebruikt op tafel Paziente
. Het DBMS zoekt de naam op in de index en vindt ID_PAZIENTE
daarin, wat de sleutel is die we nodig hebben om toegang te krijgen tot de andere tafel. Er valt dus niets toe te voegen. (In een ander DBMS zouden we een samengestelde index hebben toegevoegd op (NOME, ID_PAZIENTE)
om dit te laten gebeuren.)
Dan is er tabel Analisi
overwegen. We vinden een record via FK_ANALISI_PAZIENTE
die de ID_PAZIENTE
. bevat die wordt gebruikt om de overeenkomst te vinden, en impliciet de primaire sleutel ID_ANALISI
die zou kunnen worden gebruikt om toegang te krijgen tot de tabel, maar dit is niet eens nodig, omdat we alle informatie hebben die we nodig hebben uit de index. Er is niets meer dat we in de tabel moeten vinden. (Nogmaals, in een ander DBMS zouden we een samengestelde index hebben toegevoegd op (ID_PAZIENTE, ID_ANALISI)
om een dekkingsindex te hebben.)
Dus wat er gebeurt is slechts:lees de ene index om de andere index te lezen om te tellen. Perfect. Er valt niets toe te voegen.
We kunnen vervang COUNT(analisi0_.ID_ANALISI)
met COUNT(*)
zoals de eerste zegt alleen "tel records waar ID_ANALISI
is niet null", wat altijd het geval is als ID_ANALISI
is de primaire sleutel van de tabel. Het is dus eenvoudiger om de laatste te gebruiken en "records tellen" te zeggen. Ik verwacht echter niet dat dit de zoekopdracht aanzienlijk of helemaal niet zal versnellen.
Dus vanuit het oogpunt van query's is er niets om dit te versnellen. Hier zijn nog meer dingen die in je opkomen:
- Gepartitioneerde tabellen? Nee, ik zou hier geen voordeel in zien. Het zou sneller kunnen zijn als de query dan in parallelle threads wordt uitgevoerd, maar voor zover ik weet, is er geen parallelle uitvoering op meerdere partities in MySQL. (Ik kan me echter vergissen.)
- Defragmenteren van de tabellen? Nee, de tabellen zelf zijn niet eens toegankelijk in de query.
- Dat houdt ons over:koop betere hardware. (Sorry dat ik geen beter advies voor je heb.)