Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL nhị phân so với phi nhị phân cho các ID băm

Đúng. Thường thì một thông báo băm được lưu trữ dưới dạng biểu diễn ASCII của các chữ số hex, ví dụ:MD5 của từ 'băm' là:

0800fc577294c34e0b28ad2839435945

Đây là một chuỗi ASCII 32 ký tự.

Nhưng MD5 thực sự tạo ra giá trị băm nhị phân 128 bit. Điều này nên chỉ yêu cầu 16 byte được lưu trữ dưới dạng giá trị nhị phân thay vì chữ số hex. Vì vậy, bạn có thể đạt được một số hiệu quả về không gian bằng cách sử dụng các chuỗi nhị phân.

CREATE TABLE test.foobar (
  id BINARY(16) NOT NULL PRIMARY KEY
);

INSERT INTO test.foobar (id) VALUES (UNHEX(MD5('hash')));

Lại. nhận xét của bạn rằng bạn quan tâm đến hiệu suất hơn là hiệu quả sử dụng không gian:

Tôi không biết vì lý do gì mà kiểu dữ liệu BINARY sẽ nhanh hơn CHAR.

Lớn bằng một nửa có thể là một lợi thế cho hiệu suất nếu bạn sử dụng bộ đệm cache một cách hiệu quả. Nghĩa là, một lượng bộ nhớ đệm nhất định có thể lưu trữ gấp đôi số hàng có giá trị dữ liệu BINARY nếu chuỗi có kích thước bằng một nửa CHAR cần thiết để lưu trữ cùng một giá trị trong hệ lục phân. Tương tự như vậy, bộ nhớ đệm cho chỉ mục trên cột đó có thể lưu trữ nhiều gấp đôi.

Kết quả là một bộ nhớ cache hiệu quả hơn, bởi vì một truy vấn ngẫu nhiên có cơ hội lớn hơn để truy cập vào dữ liệu hoặc chỉ mục được lưu trong bộ nhớ cache, thay vì yêu cầu quyền truy cập đĩa. Hiệu quả bộ nhớ cache là quan trọng đối với hầu hết các ứng dụng cơ sở dữ liệu, vì thường nút cổ chai là I / O đĩa. Nếu bạn có thể sử dụng bộ nhớ đệm để giảm tần suất I / O của đĩa, thì đó là một cú nổ lớn hơn nhiều so với sự lựa chọn giữa loại dữ liệu này hay loại dữ liệu khác.

Đối với sự khác biệt giữa chuỗi băm được lưu trữ trong BINARY so với BIGINT, tôi sẽ chọn BIGINT. Hiệu quả bộ nhớ cache sẽ còn lớn hơn và trên bộ xử lý 64-bit, phép tính và so sánh số nguyên cũng sẽ rất nhanh.

Tôi không có số đo để hỗ trợ các tuyên bố ở trên. Lợi ích ròng của việc chọn một kiểu dữ liệu này hơn một kiểu dữ liệu khác phụ thuộc rất nhiều vào các mẫu dữ liệu và kiểu truy vấn trong cơ sở dữ liệu và ứng dụng của bạn. Để có câu trả lời chính xác nhất, bạn phải thử cả hai giải pháp và đo lường sự khác biệt.

Lại. giả sử của bạn rằng so sánh chuỗi nhị phân nhanh hơn so với chuỗi không phân biệt chữ hoa chữ thường mặc định, tôi đã thử kiểm tra sau:

mysql> SELECT BENCHMARK(100000000, 'foo' = 'FOO');
1 row in set (5.13 sec)

mysql> SELECT BENCHMARK(100000000, 'foo' = BINARY 'FOO');
1 row in set (4.23 sec)

Vì vậy, so sánh chuỗi nhị phân nhanh hơn 17,5% so với so sánh chuỗi không phân biệt chữ hoa chữ thường. Nhưng lưu ý rằng sau khi đánh giá biểu thức này 100 triệu lần, tổng số chênh lệch vẫn chưa đến 1 giây. Mặc dù chúng ta có thể đo lường sự khác biệt tương đối về tốc độ, nhưng sự khác biệt tuyệt đối về tốc độ thực sự không đáng kể.

Vì vậy, tôi sẽ nhắc lại:

  • Đo lường, không đoán hoặc giả sử. Những dự đoán có học thức của bạn sẽ rất nhiều lúc sai. Đo lường trước và sau mỗi thay đổi bạn thực hiện, để bạn biết nó đã giúp ích như thế nào.
  • Đầu tư thời gian và sự chú ý của bạn để bạn có được thành công lớn nhất.
  • Đừng đổ mồ hôi cho những thứ nhỏ nhặt. Tất nhiên, một sự khác biệt nhỏ sẽ cộng lại với đủ số lần lặp lại, nhưng với số lần lặp lại đó, việc cải thiện hiệu suất với lợi ích tuyệt đối lớn hơn vẫn được ưu tiên hơn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql, lặp qua các tên cột

  2. Làm thế nào để lưu trữ uuid dưới dạng số?

  3. JDBC trên Google Apps Script. Ngoại lệ:Sao kê bị hủy do hết thời gian chờ hoặc yêu cầu của khách hàng

  4. Sử dụng các hàm tổng hợp (SUM, AVG, MAX, MIN, COUNT, DISTINCT) trong MySQL

  5. mySQL chọn mã zip trong phạm vi x km / dặm trong phạm vi của y