sql >> Database >  >> RDS >> Mysql

Hoe bewaart u uuid als nummer?

Als ik het goed begrijp, gebruikt u UUID's in uw primaire kolom? Mensen zullen zeggen dat een gewone (integer) primaire sleutel sneller zal zijn, maar er is een andere manier om de donkere kant van MySQL te gebruiken. In feite is MySQL sneller bij het gebruik van binair dan wat dan ook wanneer indexen vereist zijn.

Aangezien UUID 128 bits is en als hexadecimaal wordt geschreven, is het heel eenvoudig om de UUID te versnellen en op te slaan.

Verwijder eerst in uw programmeertaal de streepjes

Van 110E8400-E29B-11D4-A716-446655440000 naar 110E8400E29B11D4A716446655440000 .

Nu zijn het 32 ​​tekens (zoals een MD5-hash, waarmee dit ook werkt).

Sinds een enkele BINARY in MySQL is 8 bits groot, BINARY(16) is de grootte van een UUID (8*16 =128).

U kunt invoegen met:

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

en zoek op met:

SELECT HEX(FieldBin) AS FieldBin FROM Table

Plaats nu in uw programmeertaal de streepjes opnieuw op de posities 9, 14, 19 en 24 om overeen te komen met uw originele UUID. Als de posities altijd verschillend zijn, zou je die informatie in een tweede veld kunnen opslaan.

Volledig voorbeeld :

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`

Als je deze techniek met een hex-tekenreeks wilt gebruiken, doe dan altijd length / 2 voor de veldlengte. Dus voor een sha512 is het veld BINARY (64) aangezien een sha512-codering 128 tekens lang is.



  1. Een lopende SELECT-instructie doden?

  2. Verbindingstime-out instellen in SQLAlchemy

  3. Synchrone statistiekupdates bijhouden

  4. Oracle Streams stap voor stap replicatievoorbeeld