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?
Odpowiedz
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.
użyj funkcji unhex, aby wynik był nieczytelny dla człowieka. – Chamnap
@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. –
@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'),"% ")' –
Blog Percona zawiera artykuł (zawierający testy porównawcze), który odpowiada na pytanie: Store UUID in an optimized way.
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.
- 1. Jak przechowywać FontFamily jako StaticResource?
- 2. Klucz podstawowy UUID w modelu wymownym jest przechowywany jako uuid, ale zwraca jako 0
- 3. UUID jako wartość domyślna w modelu Django
- 4. Pobierz BinUata UUID z Mongo jako ciąg
- 5. C++ Jak przechowywać paczkę parametr jako zmienną
- 6. Rack: Jak przechowywać URL jako zmienną?
- 7. python: jak przekonwertować prawidłowy uuid z String na UUID?
- 8. Jak przechowywać numer podzielny w nowej tablicy z javascript
- 9. Podziel długi numer jako procent
- 10. jak używać UUID w Django
- 11. Laravel 4 przy użyciu UUID jako klucz podstawowy
- 12. Najlepszy sposób obsługi dużych (UUID) jako klucz podstawowy tabeli MySQL
- 13. boost :: uuids :: uuid jako klucz w std :: unordered_map?
- 14. jak przechowywać NSDictionary jako przekształcalne właściwości w danych podstawowych
- 15. Jak przechowywać hasło jako zaszyfrowane w pliku właściwości na wiosnę
- 16. Czy warto przechowywać obiekt w Amazon Dynamo jako Json?
- 17. Apache POI - pobierz numer jako liczbę całkowitą
- 18. PostgreSQL Wydajność typu UUID
- 19. Aby porównać UUID, czy mogę użyć == lub użyć UUID.equals (UUID)?
- 20. Android Znajdź UUID określonego urządzenia Bluetooth
- 21. Używanie identyfikatorów UUID w SQLite
- 22. Format String jako numer telefonu w C#
- 23. Jak sformatować kolumnę numeryczną jako numer telefonu w SQL
- 24. za pomocą poi, Jak ustawić typ komórki jako numer
- 25. Sprawdź, czy numer SPP UUID 00001101-0000-1000-8000-00805F9B34FB istnieje na serwerze
- 26. Napisz CBCharacteristic przez UUID
- 27. SecureRandom.uuid vs UUID gem
- 28. UUID ze strukturą Play
- 29. UUID dla DynamoDB?
- 30. Biblioteka UUID dla C?
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? –
@ThomSmith Re "Identyfikatory UUID nie są bardzo wydajnymi kluczami podstawowymi". Czy należy podać źródło, które wyjaśnia, dlaczego? – Pacerier
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ć. –