2012-06-08 15 views
71

Na podstawie odpowiedzi na pytanie, UUID performance in MySQL, osoba, która odpowiada, sugeruje zapisanie numeru UUID jako numeru, a nie jako napisu. Nie jestem pewien, jak można to zrobić. Czy ktoś może mi coś zasugerować? Jak radzi sobie z tym mój kod rubinowy?Jak przechowywać uuid jako numer?

+5

Problemy z wydajnością pojawiają się tylko wtedy, gdy klucz UUID jest używany jako klucz podstawowy, ponieważ identyfikatory UUID nie są bardzo wydajnymi kluczami podstawowymi. Dlaczego potrzebujesz identyfikatorów UUID? Czy możesz zachować UUID i po prostu użyć autoinkrementacji jako klucza głównego? –

+3

@ThomSmith Re "Identyfikatory UUID nie są bardzo wydajnymi kluczami podstawowymi". Czy należy podać źródło, które wyjaśnia, dlaczego? – Pacerier

+1

To większa część danych, a generalnie potrzeba więcej instrukcji do porównania. Nie jest sekwencyjny, więc narzut indeksowania jest tylko trochę wyższy. I, oczywiście, jeśli przechowujesz go jako ciąg zamiast 128-bitowego numeru, jak wydaje się, że OP robi, sytuacja się pogarsza. To nie jest straszny klucz, ale nie użyłbym go, gdyby nie było jakiegoś zewnętrznego powodu, aby to zrobić. –

Odpowiedz

99

Jeśli dobrze rozumiem, używasz identyfikatorów UUID w kolumnie głównej? Ludzie powiedzą, że zwykły (całkowity) klucz podstawowy będzie szybszy, ale jest inny sposób użycia ciemnej strony MySQL. W rzeczywistości MySQL jest szybszy przy użyciu binarny niż cokolwiek innego, gdy indeksy są wymagane.

Ponieważ UUID ma 128 bitów i jest zapisany w systemie szesnastkowym, bardzo łatwo przyspieszyć i zapisać identyfikator UUID.

Po pierwsze, w swoim języku programowania usuń myślniki

Od 110E8400-E29B-11D4-A716-446655440000 do 110E8400E29B11D4A716446655440000.

Teraz 32 znaki (jak hash MD5, z którym to również działa).

Ponieważ pojedynczy BINARY w MySQL ma rozmiar 8 bitów, BINARY(16) ma rozmiar UUID (8 * 16 = 128).

można wstawiać za pomocą:

INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))

i kwerendy przy użyciu:

SELECT HEX(FieldBin) AS FieldBin FROM Table

Teraz w swoim języku programowania, ponownie wstawić kreski w pozycjach 9, 14, 19 i 24, aby dopasować swój oryginalny UUID. Jeśli pozycje są zawsze różne, możesz przechowywać te informacje w drugim polu.

Pełny przykład:

CREATE TABLE `test_table` (
    `field_binary` BINARY(16) NULL , 
    PRIMARY KEY ( `field_binary`) 
) ENGINE = INNODB ; 

INSERT INTO `test_table` (
    `field_binary` 
) 
VALUES (
    UNHEX( '110E8400E29B11D4A716446655440000') 
); 

SELECT HEX(field_binary) AS field_binary FROM `test_table` 

Jeśli chcesz użyć tej techniki z dowolnym ciągiem szesnastkowym, zawsze length/2 dla długości pola. Tak więc dla sha512 pole będzie miało postać BINARY (64), ponieważ kodowanie sha512 ma 128 znaków.

+0

użyj funkcji unhex, aby wynik był nieczytelny dla człowieka. – Chamnap

+0

@Chamnap Funkcja UNHEX zamieni HEX na BINARY w twojej bazie danych. Możesz wtedy używać indeksów bez problemu i ze wzrostem wydajności (tak, tak!). Następnie odczytałeś dane z funkcją 'HEX', tak jak w moim przykładzie. Więc nie, nie możesz odczytać wyniku z 'UNHEX', ale możesz użyć' HEX'. Pamiętaj, że komputer jest binarny, zawsze szybszy. –

+3

@Chamnap Załóżmy, że masz 10 000 wierszy w twojej bazie danych i zostały dodane za pomocą funkcji UNHEX i chcesz wyszukać UUID '110E8400-E29B-11D4-A716-446655440000'. Po prostu zrób coś w stylu: "WYBIERZ * Z tabeli testowej WHERE field_binary LIKE CONCAT ("% ", UNHEX ('110E8400E29B11D4A716446655440000'),"% ")' –

0

Nie sądzę, że dobrym pomysłem jest użycie pliku binarnego.

Powiedzmy, że chcesz zapytać jakąś wartość:

SELECT HEX(field_binary) AS field_binary FROM `test_table` 

Jeśli wracamy kilka wartości wtedy jesteśmy wywołaniu funkcji HEX kilkakrotnie.

Jednak głównym problemem jest następny:

SELECT * FROM `test_table` 
    where field_binary=UNHEX('110E8400E29B11D4A716446655440000') 

i za pomocą funkcji wewnątrz, gdzie po prostu ignoruje indeks.

także

SELECT * FROM `test_table` 
    where field_binary=x'[email protected]#*#(&#@$9' 

Could prowadzi do wielu problemów.

Powiązane problemy