Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Łączenie tabel InnoDB z tabelami MyISAM

Od razu rzuca mi się w oczy MyISAM .

ASPEKT #1:Samo JOIN

Ilekroć występują sprzężenia obejmujące MyISAM i InnoDB, tabele InnoDB będą miały blokadę na poziomie tabeli zamiast blokowania na poziomie wiersza z powodu zaangażowania MyISAM w zapytanie i MVCC nie można zastosować do danych MyISAM. MVCC w niektórych przypadkach nie można nawet zastosować do InnoDB.

ASPEKT 2:Zaangażowanie MyISAM

Z innej perspektywy, jeśli jakiekolwiek tabele MyISAM są aktualizowane przez INSERT, UPDATE lub DELETE, tabele MyISAM zaangażowane w zapytanie JOIN zostaną zablokowane dla innych połączeń DB, a zapytanie JOIN będzie musiało czekać na odczytanie tabel MyISAM. Niestety, jeśli w zapytaniu JOIN występuje mieszanka InnoDB i MyISAM, tabele InnoDB będą musiały doświadczyć przerywanej blokady, tak jak jej partnerzy MyISAM w zapytaniu JOIN, ponieważ wstrzymywane są przed zapisem.

Należy pamiętać, że MVCC będzie nadal zezwalać na transakcje READ-UNCOMMITTED i REPEATABLE-READ, aby działały dobrze i pozwalały niektórym widoki danych są dostępne dla innych transakcji. Nie mogę powiedzieć tego samego o READ-COMMITTED i SERIALIZABLE .

ASPEKT #3:Optymalizator zapytań

MySQL opiera się na kardynalności indeksu w celu określenia zoptymalizowanego planu EXPLAIN. Kardynalność indeksu jest stabilna w tabelach MyISAM, dopóki w tabeli nie wydarzy się wiele operacji INSERT, UPDATE i DELETE, dzięki czemu można okresowo uruchamiać OPTIMIZE TABLE z tabelami MyISAM. Kardynalność indeksu InnoDB NIGDY NIE JEST STABILNA !!! Jeśli uruchomisz SHOW INDEXES FROM *innodbtable*; , zobaczysz zmianę kardynalności indeksu za każdym razem, gdy uruchomisz to polecenie. To dlatego, że InnoDB zagłębi się w indeks, aby oszacować kardynalność. Nawet jeśli uruchomisz OPTIMIZE TABLE w stosunku do tabeli InnoDB, spowoduje to tylko defragmentację tabeli. OPTIMIZE TABLE uruchomi ANALYZE TABLE wewnętrznie do generowania statystyk indeksów w tabeli. To działa dla MyISAM. InnoDB ignoruje to.

Moja rada dla ciebie to zrobić wszystko i przekonwertować wszystko do InnoDB i odpowiednio zoptymalizować swoje ustawienia.

AKTUALIZACJA 18.12.2012 15:56 EDT

Wierz lub nie, ale jest wciąż otwarty bilet na dołączanie do InnoDB/MyISAM podczas WYBIERZ DO AKTUALIZACJI . Jeśli go przeczytasz, podsumowuje rozdzielczość w następujący sposób:NIE RÓB TEGO !!! .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL COUNT DISTINCT

  2. Python konwertujący wynik zapytania mysql na json

  3. Kolejność wykonania zapytania / klauzuli MySQL

  4. Aktualizowanie klucza podstawowego MySQL

  5. Jak aliasować pole lub kolumnę w MySQL?