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

Bảng với 80 triệu bản ghi và thêm một chỉ mục mất hơn 18 giờ (hoặc mãi mãi)! Giờ thì sao?

Ok, hóa ra vấn đề này không chỉ đơn giản là tạo một bảng, lập chỉ mục và quên vấn đề :) Đây là những gì tôi đã làm trong trường hợp người khác gặp phải vấn đề tương tự (Tôi đã sử dụng một ví dụ về Địa chỉ IP nhưng nó hoạt động cho người khác cả kiểu dữ liệu):

Vấn đề:Bảng của bạn có hàng triệu mục nhập và bạn cần thêm chỉ mục thật nhanh

Usecase: Cân nhắc lưu trữ hàng triệu địa chỉ IP trong một bảng tra cứu. Thêm địa chỉ IP không phải là một vấn đề lớn nhưng việc tạo chỉ mục trên chúng mất hơn 14 giờ.

Giải pháp :Phân vùng bảng của bạn bằng cách sử dụng Partitionin của MySQL chiến lược g

Trường hợp số 1:Khi bảng bạn muốn chưa được tạo

CREATE TABLE IPADDRESSES(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;

Trường hợp số 2:Khi bảng bạn muốn đã được tạo. Có vẻ như có một cách để sử dụng ALTER TABLE để làm điều này nhưng tôi vẫn chưa tìm ra giải pháp thích hợp cho việc này. Thay vào đó, có một giải pháp hơi kém hiệu quả:

CREATE TABLE IPADDRESSES_TEMP(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id)
) ENGINE=MYISAM;

Chèn địa chỉ IP của bạn vào bảng này. Và sau đó tạo bảng thực tế với các phân vùng:

CREATE TABLE IPADDRESSES(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;

Và cuối cùng

INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)

Và bạn bắt đầu ... lập chỉ mục trên bảng mới khiến tôi mất khoảng 2 giờ trên máy 3.2GHz với RAM 1GB :) Hy vọng điều này sẽ hữu ích.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wampserver 2.1 có biểu tượng màu cam sau khi cài đặt trên Windows 7

  2. MySQL:Dữ liệu GIS không hợp lệ được cung cấp cho hàm st_geometryfromtext

  3. Các cách tốt nhất để sửa chữa bảng InnoDB bị hỏng trong MySQL

  4. MySQL:Chọn tất cả các ngày giữa phạm vi ngày và lấy dữ liệu bảng ngày khớp với

  5. Hàm MySQL ASIN () - Trả về Arc Sine của một số