V InnoDB každý sekundární index interně obsahuje sloupec primárního klíče tabulky. Tedy index název on column (name) je implicitně na sloupcích (name, id).
To znamená, že EXPLAIN zobrazí váš přístup k tabulce kategorií jako "index-scan" (toto je zobrazeno v type sloupec jako "index"). Naskenováním indexu má také přístup ke sloupci id, který používá k vyhledání řádků ve druhé tabulce, položce.
Pak také využívá index položky na (id_kategorie), který je skutečně (id_kategorie, id), a je schopen načíst item.id pro váš výběrový seznam jednoduše přečtením indexu. Tabulku není třeba vůbec číst (toto je zobrazeno v Extra jako "Using index").
MyISAM tímto způsobem neukládá primární klíče se sekundárním klíčem, takže nemůže získat stejné optimalizace. Přístup k tabulce kategorií je typu "ALL", což znamená skenování tabulky.
Očekával bych, že přístup k položce tabulky MyISAM bude "ref", protože vyhledává řádky pomocí indexu on (category_id). Optimalizátor však může získat zkreslené výsledky, pokud máte v tabulce velmi málo řádků nebo pokud jste neprovedli ANALYZE TABLE item
od vytvoření indexu.
K vaší aktualizaci:
Vypadá to, že optimalizátor upřednostňuje skenování indexu před skenováním tabulky, takže využije příležitosti k provedení indexového skenování v InnoDB a na první místo umístí tabulku kategorií. Optimalizátor se rozhodne změnit pořadí tabulek namísto použití tabulek v pořadí, které jste jim zadali ve svém dotazu.
V tabulkách MyISAM bude jedno prohledávání tabulky podle toho, kterou tabulku zvolí jako první, ale umístěním tabulky kategorií na druhé místo se připojí k indexu PRIMÁRNÍHO klíče kategorie namísto sekundárního indexu položky. Optimalizátor upřednostňuje vyhledávání před jedinečným nebo primárním klíčem (zadejte "eq_ref").