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

Spojení tabulek InnoDB s tabulkami MyISAM

Co na mě okamžitě vyskočí, je MyISAM .

ASPECT #1:Samotný JOIN

Kdykoli dojde ke spojení zahrnujícím MyISAM a InnoDB, tabulky InnoDB skončí se zámkem na úrovni tabulky namísto zamykání na úrovni řádků kvůli zapojení MyISAM do dotazu a MVCC nelze použít na data MyISAM. MVCC v některých případech nelze dokonce použít na InnoDB.

ASPECT #2:Zapojení MyISAM

Z jiného pohledu, pokud jsou nějaké tabulky MyISAM aktualizovány pomocí INSERT, UPDATE nebo DELETE, tabulky MyISAM zahrnuté v dotazu JOIN budou uzamčeny z jiných připojení DB a dotaz JOIN musí počkat, dokud nebude možné číst tabulky MyISAM. Bohužel, pokud je v dotazu JOIN směs InnoDB a MyISAM, tabulky InnoDB by musely zaznamenat přerušovaný zámek jako jejich partneři MyISAM v dotazu JOIN, protože by jim bylo zdržováno psaní.

Mějte na paměti, že MVCC bude stále povolovat READ-UNCOMMITTED a REPEATABLE-READ transakce, aby fungovaly dobře a ponechaly určité zobrazení dat bude k dispozici pro jiné transakce. Nemohu říci totéž pro READ-COMMITTED a SERIALIZABLE .

ASPECT #3:Optimalizátor dotazů

MySQL se při určování optimalizovaného plánu EXPLAIN spoléhá na kardinalitu indexu. Kardinalita indexu je v tabulkách MyISAM stabilní, dokud v tabulce neproběhne mnoho INSERT, UPDATE a DELETE, pomocí kterých můžete pravidelně spouštět OPTIMIZE TABLE proti tabulkám MyISAM. Kardinalita indexu InnoDB NENÍ NIKDY STABILNÍ!!! Pokud spustíte SHOW INDEXES FROM *innodbtable*; , uvidíte, že se mohutnost indexu změní při každém spuštění tohoto příkazu. To proto, že InnoDB provede ponory do indexu, aby odhadl mohutnost. I když spustíte OPTIMIZE TABLE proti tabulce InnoDB, která pouze defragmentuje tabulku. OPTIMIZE TABLE spustí ANALYZE TABLE interně pro generování statistik indexu podle tabulky. To funguje pro MyISAM. InnoDB to ignoruje.

Moje rada pro vás je jít do toho a vše převést na InnoDB a podle toho optimalizovat svá nastavení.

AKTUALIZACE 2012-12-18 15:56 EDT

Věřte tomu nebo ne, stále existuje otevřený lístek pro připojení k InnoDB/MyISAM během VÝBĚRU AKTUALIZACE . Pokud si to přečtete, shrnuje to rozlišení takto:NEDĚLEJTE TO !!! .



  1. Jak zachovat pořadí vkládání na SQL Server

  2. Jak mohu vložit objekt JSON do Postgres pomocí Java PrepareStatement?

  3. Import databáze do MySQL nebo MariaDB

  4. SQL Server Delete Statement:Jak odebrat jeden nebo více řádků z tabulky