2011-11-05 20 views
7

Od najnowszego kodu źródłowego (nie jest pewne, czy to C lub C++) MySQL, w jaki sposób robi autoinkrement? Mam na myśli, czy jest on skuteczny, ponieważ przechowuje się go jak zasób metadanych w tabeli, w której ostatnio został przerwany, czy też musi wykonać skanowanie tabeli w celu znalezienia największego identyfikatora używanego w tabeli? Czy widzisz również negatywne aspekty korzystania z autoinkrementacji, gdy patrzysz na to, jak jest on implementowany w porównaniu z, powiedzmy, PostgreSQL?MySQL, C++ - programowo, jak działa autoinżynieria MySQL?

+0

Z którego silnika korzystasz? InnoDB) –

Odpowiedz

2

To będzie zależeć od używanego silnika bazy danych. InnoDB zapisuje największą wartość w pamięci, a nie na dysku. Bardzo wydajny. Sądzę, że większość silników zrobiłaby coś podobnego, ale nie może tego zagwarantować.

InnoDB's Auto Increment zamierza uruchomić poniższe zapytanie raz kiedy DB jest załadowany i zapisać zmienną w pamięci:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

Porównując to do PostgreSQL „Kompletna brakiem auto_increment zależy od tego, jak można zaimplementować pole siebie. (Przynajmniej ostatnio go brakowało. Być może się zmieniło). Większość stworzyłaby SEQUENCE. Który wydaje się być przechowywany w pseudo-stole w pamięci. Wziąłbym InnoDB, aby był prostszy i lepszy sposób. Sądzę, że InnoDB byłby bardziej wydajny, gdyby nie były równe.

+0

Okay, więc myślę, że przeczytałem to z InnoDB, gdy baza danych się ładuje, szuka ostatniej sekwencji, a następnie zapisuje ją w pamięci wirtualnej jako część metadanych tabeli. Dzięki. – Volomike