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

MySQL definiujący kolumnę jako UNIQUE z AUTO_INCREMENT zamiast jako klucz podstawowy

Definiowanie MySQL bez jasnego klucze podstawowe to bardzo, bardzo zły pomysł.
Jeśli brakuje pliku PK, MySQL utworzy niejawny (ale bardzo rzeczywisty) klucz podstawowy z automatycznym przyrostem liczby całkowitej.
Ten plik PK będzie zawarty w każdym kluczu pomocniczym w InnoDB i określi Twoją podstawową kolejność sortowania w MyISAM.

Konsekwencja
Właśnie spowolniłeś wydajność każdego wyboru, wstawienia i aktualizacji.
Bez żadnego celu.

InnoDB:wymagane dodatkowe wyszukiwanie, aby uzyskać dostęp do danych tabeli
W InnoDB należy wykonać dodatkowe wyszukiwanie, ponieważ wszystkie indeksy pomocnicze odnoszą się do PK, a nie do samych wierszy.

MyISAM:marnowanie miejsca
W MyISAM kara nie jest tak duża, ale nadal ciągniesz wzdłuż 4-bajtowego nieużywanego pola, które nie jest używane.

InnoDB + MyISAM:bezużyteczne generowanie pola autoinkrementacji
Ponieważ tworzony jest niejawny autoinkrementujący PK, a do złączeń potrzebny był dodatkowy klucz autoinkrementacji; Aby zapobiec duplikowaniu pól autoinkrementacji, masz teraz nie 1, ale 2 blokady tabeli na wstawkę.

InnoDB:z dołączeniami do sondy wyszukiwania, o której mowa powyżej, podwaja się
Jeśli robisz sprzężenie przy użyciu pola, które nie jest PK, InnoDB musi wykonać dodatkowe wyszukiwanie dla każdego przyłączenia aby dostać się do zapisów tego drugiego stołu.

InnoDB:najgorsze ze wszystkich tracisz korzyści z pokrywania indeksów
Wyłączyłeś jedną z najlepszych optymalizacji w InnoDB, obejmującą indeksy.
Jeśli MySQL może rozwiązać zapytanie używając tylko danych z indeksów, nigdy nie odczyta tabeli, co spowoduje znaczną szybkość osiągać. Teraz, gdy 50% każdego indeksu w InnoDB to niewykorzystana przestrzeń, właśnie ograniczyłeś swoje szanse na użycie tej optymalizacji.

Proszę pokonać tego wykonawcę kijem podpowiedzi!

Linki:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (powolny link, ale zalecamy przeczytanie).
O'Reilly na indeksach pokrywających InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , jeśli twój wykonawca mówi, że nie ma to większego znaczenia, ponieważ używa MyISAM, pokonaj go ponownie, zawsze powinieneś używać InnoDB, chyba że masz dobry powód, aby nie.
InnoDB jest znacznie bezpieczniejszy w produkcji, MyISAM ma swój używa, ale zbyt łatwo ulega uszkodzeniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dołącz i wielokrotność i warunki

  2. Biblioteka muzyczna Baza danych MySQL

  3. Czy istnieje sterownik mysql na nodejs, który obsługuje procedury składowane?

  4. Nie można zaimportować modułu MySQLdb w Pythonie

  5. przechowywanie numerów jako varchar