sql >> Databáze >  >> RDS >> Mysql

mysql rozdíl v použití indexu mezi MyISAM a InnoDB

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").




  1. Java 1.6 a Oracle JDBC 14 setQueryTimeout nefungují

  2. Pořadí MySQL podle polí a rodičů

  3. Python:nepodporovaný formátový znak ''' (0x27) na indexu 350

  4. Jak vložit data Excel nebo CSV do tabulky pomocí grafického uživatelského rozhraní v SQL Server - SQL Server / Výukový program TSQL, část 102