Nếu tôi hiểu đúng, bạn đang sử dụng UUID trong cột chính của mình? Mọi người sẽ nói rằng khóa chính thông thường (số nguyên) sẽ nhanh hơn, nhưng có một cách khác là sử dụng mặt tối của MySQL. Trên thực tế, MySQL sử dụng nhị phân nhanh hơn bất kỳ thứ gì khác khi các chỉ mục được yêu cầu.
Vì UUID là 128 bit và được viết dưới dạng thập lục phân, nên rất dễ dàng để tăng tốc và lưu trữ UUID.
Đầu tiên, trong ngôn ngữ lập trình của bạn, hãy xóa dấu gạch ngang
Từ 110E8400-E29B-11D4-A716-446655440000
đến 110E8400E29B11D4A716446655440000
.
Bây giờ nó là 32 ký tự (như băm MD5, điều này cũng hoạt động với).
Vì một đơn BINARY
trong MySQL có kích thước 8 bit, BINARY(16)
là kích thước của một UUID (8 * 16 = 128).
Bạn có thể chèn bằng cách sử dụng:
INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))
và truy vấn bằng cách sử dụng:
SELECT HEX(FieldBin) AS FieldBin FROM Table
Bây giờ bằng ngôn ngữ lập trình của bạn, hãy chèn lại các dấu gạch ngang ở các vị trí 9, 14, 19 và 24 để khớp với UUID ban đầu của bạn. Nếu các vị trí luôn khác nhau, bạn có thể lưu trữ thông tin đó trong trường thứ hai.
Ví dụ đầy đủ:
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`
Nếu bạn muốn sử dụng kỹ thuật này với bất kỳ chuỗi hex nào, hãy luôn thực hiện length / 2
với độ dài trường. Vì vậy, đối với sha512, trường sẽ là BINARY (64)
vì mã hóa sha512 dài 128 ký tự.