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

Zrozumienie struktury rekordów MyISAM

Informacje zawarte w pytaniu dotyczące MyISAM są trafne. Chciałbym jednak odpowiedzieć na dwa dodatkowe pytania:

NAJNOWSZE PYTANIE

Według książki

Rozdział 10 :„Silniki pamięci masowej” Strona 196 Akapit 7 mówi

Na podstawie tego akapitu stary rekord zostaje nadpisany danymi powiązania tylko wtedy, gdy nowe dane do wstawienia nie mieszczą się w poprzednio przydzielonym bloku. Może to spowodować wiele nadętych rzędów.

DODATKOWE PYTANIE

Z mojej poprzedniej odpowiedzi byłoby wiele bloków, które mają

  • blok przestrzeni
  • długość rekordu
  • liczba niewykorzystanych bajtów w bloku
  • Flagi wskaźnika wartości NULL
  • ewentualnie wskaźnik do kontynuacji rekordu, jeśli rekord nie mieścił się we wcześniej utworzonej przestrzeni i musiał zostać podzielony

Takie łącza do rekordów zaczynałyby się przed każdym wierszem, w którym wstawiane są zbyt duże dane. Może to nadwyrężyć tabele MyISAM .MYD plik bardzo szybko.

SUGESTIE

Domyślnym formatem wiersza MyISAM jest dynamiczny. Gdy tabela jest dynamiczna i zawiera wiele operacji WSTAWIANIA, AKTUALIZACJI i USUŃ, taka tabela musiałaby zostać zoptymalizowana za pomocą

OPTIMIZE TABLE mytable;

Istnieje alternatywa:zmień format wiersza tabeli na Stały. W ten sposób wszystkie rzędy mają ten sam rozmiar. W ten sposób ustawiasz format wiersza Stały:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Nawet w przypadku formatu Fixed Row, lokalizacja dostępnego rekordu musi zająć trochę czasu, ale czas byłby równy czasowi wyszukiwania O(1) (mówiąc językiem laika, zlokalizowanie dostępnego rekordu zajęłoby tyle samo czasu, bez względu na liczbę wierszy tabela zawiera lub ile jest usuniętych wierszy). Możesz ominąć ten krok, włączając concurrent_insert w następujący sposób:

Dodaj to do my.cnf

[mysqld]
concurrent_insert = 2

Restart MySQL nie jest wymagany. Po prostu uruchom

mysql> SET GLOBAL concurrent_insert = 2;

Spowodowałoby to, że wszystkie WSTAWKI znalazłyby się z tyłu tabeli bez szukania wolnego miejsca.

Zaleta tabel o stałych wierszach

  • WSTAWIANIE, AKTUALIZACJA i USUWANIE byłyby nieco szybsze
  • SELECT są o 20-25% szybsze

Oto niektóre z moich postów na temat szybszego działania SELECT w związku z naprawianymi formatami wierszy

Wady tabel ze stałymi wierszami

W większości przypadków po uruchomieniu ALTER TABLE mytable ROW_FORMAT=Fixed; , stół może urosnąć 80-100%. .MYI plik (strony indeksowe dla tabeli MyISAM) również rósł w tym samym tempie.

EPILOG

Jeśli potrzebujesz szybkości przy stołach MyISAM i możesz żyć z większymi stołami, potrzebne będą moje alternatywne sugestie. Jeśli chcesz zaoszczędzić miejsce dla każdej tabeli MyISAM, pozostaw format wiersza bez zmian (dynamiczny). Będziesz musiał skompresować tabelę za pomocą OPTIMIZE TABLE mytable; częściej w przypadku tabel dynamicznych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć Left Outer z Laravelem?

  2. Czy potrzebuję htmlentities() lub htmlspecialchars() w przygotowanych instrukcjach?

  3. Zend_Db:Jak połączyć się z bazą danych MySQL przez tunel SSH?

  4. Mysql, aby wybrać rekord miesięczny, nawet jeśli dane nie istnieją

  5. Tabela ALTER TABLE AUTO_INCREMENT =$x