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

Làm thế nào để lưu trữ một số 128 bit trong một cột duy nhất trong MySQL?

Tôi thấy mình đã hỏi câu hỏi này và từ tất cả các bài viết tôi đọc không bao giờ tìm thấy bất kỳ so sánh hiệu suất nào. Vì vậy, đây là nỗ lực của tôi.

Tôi đã tạo các bảng sau, được điền với 2.000.000 địa chỉ ip ngẫu nhiên từ 100 mạng ngẫu nhiên.

CREATE TABLE ipv6_address_binary (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr BINARY(16) NOT NULL UNIQUE
);

CREATE TABLE ipv6_address_twobigints (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    haddr BIGINT UNSIGNED NOT NULL,
    laddr BIGINT UNSIGNED NOT NULL,
    UNIQUE uidx (haddr, laddr)
);

CREATE TABLE ipv6_address_decimal (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr DECIMAL(39,0) NOT NULL UNIQUE
);

Sau đó, tôi CHỌN tất cả các địa chỉ ip cho mỗi mạng và ghi lại thời gian phản hồi. Thời gian phản hồi trung bình trên bảng hai chữ số là khoảng 1 giây trong khi trên bảng nhị phân là khoảng một phần trăm giây.

Đây là các truy vấn.

SELECT COUNT(*) FROM ipv6_address_twobigints
WHERE haddr & NETMASK_HIGH = NETWORK_HIGH
AND laddr & NETMASK_LOW = NETWORK_LOW

SELECT COUNT(*) FROM ipv6_address_binary
WHERE addr >= NETWORK
AND addr <= BROADCAST

SELECT COUNT(*) FROM ipv6_address_decimal
WHERE addr >= NETWORK
AND addr <= BROADCAST

Thời gian phản hồi trung bình:

Biểu đồ:

BINARY_InnoDB  0.0119529819489
BINARY_MyISAM  0.0139244818687
DECIMAL_InnoDB 0.017379629612
DECIMAL_MyISAM 0.0179929423332
BIGINT_InnoDB  0.782350552082
BIGINT_MyISAM  1.07809265852


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi dấu thời gian thành ngày tháng trong truy vấn MySQL

  2. Nhận dữ liệu phân cấp từ các bảng tự tham chiếu

  3. Cài đặt MySQL Workbench để quản trị cơ sở dữ liệu

  4. Java chạy bởi trình kích hoạt MySQL

  5. Mysql ERROR 1241 (21000):Toán hạng phải chứa 1 (các) cột