Rozdíl ve výkonu je možná kvůli e.id_dernier_fichier
je v indexu použitém pro JOIN, ale e.codega
nebýt v tom index.
Bez úplné definice obou tabulek a všech jejich indexů to nelze s jistotou říci. Také by pomohlo zahrnutí dvou EXPLAIN PLANs pro dva dotazy.
Zatím však mohu upřesnit pár věcí...
Pokud je INDEX SLUSTROVANÝ (to platí i pro PRIMÁRNÍ KLÍČE), data jsou ve skutečnosti fyzicky uložena v pořadí INDEXU. To znamená, že víte, že chcete pozici x v INDEXU také implicitnost znamená, že chcete pozici x v TABULCE.
Pokud však INDEX není seskupený, INDEX vám pouze poskytuje vyhledávání. Efektivně říká pozice x v INDEXU odpovídá pozici y v TABULCE.
Zde je důležité přistupovat k polím, která nejsou uvedena v INDEXU. Pokud tak učiníte, musíte ve skutečnosti přejít do TABULKY, abyste získali data. V případě CLUSTERED INDEXU už tam jste, režie hledání tohoto pole je docela nízká. Pokud však INDEX není seskupený, musíte efektivně PŘIPOJIT TABULKU k INDEXU a poté najít pole, které vás zajímá.
Poznámka; Složený index na (id_dernier_fichier, codega)
se velmi liší od jednoho indexu pouze na (id_dernier_fichier)
a samostatný index pouze na (codega)
.
V případě Vašeho dotazu si myslím, že nemusíte kód měnit vůbec. Ale můžete těžit ze změny indexů.
Uvádíte, že chcete získat přístup k mnohým pole. Uvádět všechna tato pole do složeného indexu pravděpodobně není nejlepší řešení. Místo toho můžete chtít vytvořit CLUSTERED INDEX na (id_dernier_fichier)
. To znamená, že jakmile bude *id_dernier_fichier* nalezen, jste již na správném místě, kde získáte také všechna ostatní pole.
UPRAVIT Poznámka o MySQL a CLUSTERED INDEXech
13.2.10.1. Seskupené a sekundární indexy
Každá tabulka InnoDB má speciální index nazývaný clusterovaný index, kde jsou uložena data pro řádky:
- Pokud na své tabulce definujete PRIMÁRNÍ KLÍČ, InnoDB jej použije jako seskupený index.
- Pokud nedefinujete PRIMARY KEY pro vaši tabulku, MySQL vybere první UNIQUE index, který má pouze NOT NULL sloupce jako primární klíč a InnoDB jej použije jako klastrovaný index.
- Pokud tabulka nemá PRIMÁRNÍ KLÍČ nebo vhodný UNIQUE index, InnoDB interně vygeneruje skrytý seskupený index na syntetickém sloupci obsahujícím hodnoty ID řádku. Řádky jsou seřazeny podle ID, které InnoDB přiřadí řádkům v takové tabulce. ID řádku je 6bajtové pole, které se monotónně zvětšuje při vkládání nových řádků. Řádky seřazené podle ID řádku jsou tedy fyzicky v pořadí vložení.