2013-04-20 13 views
8

Mam ciąg UUID, który chcę użyć jako klucz podstawowy mojej tabeli MySQL, UUID to 32-znakowy łańcuch szesnastkowy (po usunięciu znaków "-"). Z uwagi na to, że lepiej jest użyć kolumny liczbowej (int) jako klucza podstawowego w bazie danych, chciałbym przekonwertować to na liczbę całkowitą, ale nie jestem pewien najlepszego sposobu na obsłużenie go.Najlepszy sposób obsługi dużych (UUID) jako klucz podstawowy tabeli MySQL

  1. Ze względu na wielkość napisu (tj. UUID = 'a822ff2bff02461db45ddcd10a2de0c2'), muszę przerwać to pod wieloma 'podciągi'.
  2. Obecnie używam PHP w 32-bitowej architekturze, więc konwersja w PHP nie zadziała z powodu rozmiaru PHP_INT_MAX (max 0xFFFFFFFF). I podejrzewam, że byłoby to samo ograniczenie dla MySQL.
  3. Nie podoba mi się pomysł wielu kluczy podstawowych jako poprawki do tego, wolałbym raczej użyć reprezentacji ciągów, nawet jeśli nie jest to preferowana metoda.

Być może myślę o tym wszystko źle i nie jestem przeciwko czytaniu dokumentacji, więc albo przykłady, albo sugerowana lektura jako odpowiedź byłyby do przyjęcia.

+0

Należy również pamiętać, że to pole identyfikatora będzie używane do łączenia i wybierania. –

Odpowiedz

25

W większości przypadków najlepiej jest przechowywać identyfikatory UUID/GUID jako BINARY(16). Zobacz te pytania związane StackOverflow:

Konwersja może (i prawdopodobnie powinno) być wykonane w MySQL zamiast PHP tak czy używasz 32-bitowego klienta PHP lub 64bits nie ma znaczenia (gra słów: P)

+0

Brzmi dokładnie to, czego szukałem. Identyfikator GUID/UUID nie jest generowany przeze mnie, jest pobierany ze źródła zewnętrznego. Jest unikalny i służy jako klucz podstawowy. @PaulProgrammer Doceniam twoje szybkie odpowiedzi też, mam +1 dla was obu. Dziękuję za pomoc w tych odpowiedziach. –

+0

@Hazzit - czy wiesz, czy można powiązać UUID jako ciąg z metodą bind_param w MySQLi i po prostu skierować go do pola binarnego (16)? Mam problem z ustaleniem, czy najpierw muszę wykonać jakąkolwiek konwersję. – nickdnk

1

Użyj typu łańcucha, a nie liczby całkowitej. Lepsze jest tylko wtedy, gdy rozwiązuje problem.

Jeśli naprawdę zależy Ci na szybkości wyszukiwania, użyj klucza syntetycznego (automatycznego przyrostu). Możesz umieścić unikalne ograniczenie w kolumnie UUID i użyć go tylko raz, aby wyszukać klucz syntetyczny, który jest następnie używany do łączenia itd.

+0

Użyłem ciągów w poprzednich projektach i sądzę, że (w produkcji) mówilibyśmy tylko kilka milionów rekordów jako dużą liczbę, więc nie sądzę, że jest to duży problem z wydajnością (używając łańcuchów), nie jestem całkiem pewien w jakim rozmiarze trafienie wydajnościowe będzie wchodzić w grę przy użyciu ciągów w porównaniu z polami numerycznymi. Biorąc pod uwagę rozmiar, nie jestem do końca pewien, czy syntetyczny klucz podstawowy byłby korzystny w milionach scenariuszy (powiedzmy 10 milionów szczytów). –

+0

Więc mówisz, że nie ma sposobu na łatwe zapakowanie/zapisanie tego w postaci numerycznej, moje opcje to ciągi i łańcuchy z syntetycznymi klawiszami auto-inkrementacji. –

+0

Nie stanowi to problemu, dopóki nie będzie problemu. Bazy danych jakości produkcji (w tym mysql) mają bardzo sprytne algorytmy indeksowania do obsługi zapytań o łańcuchy. Jeśli nie przejmujesz się jeszcze wydajnością, dlaczego walniesz głową w ścianę o maksymalnych liczbach całkowitych w oryginalnym pytaniu? – PaulProgrammer

0

Zależy to również od silnika do przechowywania. TokuDB powinien poradzić sobie z tymi wszystkimi problemami.

Powiązane problemy