Thêm chỉ mục vào các bảng mysql lớn


13

Tôi có một cái bàn

| cơ sở_schedule_line_items | TẠO BẢNG base_schedule_line_items(
idint (10) không dấu KHÔNG NULL AUTO_INCREMENT,
installmentint (10) không dấu KHÔNG NULL,
on_datengày KHÔNG NULL,
actual_datengày DEFAULT NULL,
payment_typeint (11) KHÔNG NULL,
scheduled_principal_outstandingthập phân (65,0) KHÔNG NULL,
scheduled_principal_duethập phân (65,0) KHÔNG NULL,
scheduled_interest_outstandingthập phân (65,0) KHÔNG NULL,
scheduled_interest_duethập phân (65,0) KHÔNG NULL,
currencyint (11) KHÔNG NULL,
updated_atdatetime KHÔNG NULL DEFAULT '2013-01-06 14:29:16',
created_atdatetime KHÔNG NULL DEFAULT ' 2013-01-06 14:29:16 ',
loan_base_schedule_idint (10) không dấu KHÔNG NULL,
lending_idint (10) không dấu KHÔNG NULL,
rescheduletinyint (1) DEFAULT' 0 ',
PRIMARY KEY ( id),
KEY index_base_schedule_line_items_loan_base_schedule ( loan_base_schedule_id), KEY index_bslt_spd( scheduled_principal_due),
KHÓA index_bslt_lending(lending_id),
KEY index_bslt_actualdate( actual_date),
KEY index_bslt_spsila ( loan_base_schedule_id, scheduled_principal_due, scheduled_interest_due, actual_date),
KEY index_bslt_ondate( on_date),
KEY index_bslt_oa( on_date, actual_date),
KEY index_bslt_ol( on_date, loan_base_schedule_id),
KEY index_bslt_oli( on_date, lending_id)
) ENGINE = InnoDB AUTO_INCREMENT = 30.410.126 DEFAULT CHARSET = utf8 |

Bây giờ bảng này có 30 triệu bản ghi trong đó, tôi cần thêm hai chỉ mục nữa và nó giống như phải mất nhiều năm để thêm nó.

thay đổi bảng base_schedule_line_items thêm chỉ mục index_bslt_sla (lên lịch_principal_due, fact_date, loan_id);
thay đổi bảng base_schedule_line_items thêm index index_bslt_ssla (lên lịch_principal_due, lên lịch_interest_due, loan_id, fact_date);

Tôi đã sử dụng truy vấn được đề cập dưới đây để tìm ra kích thước của bảng

CHỌN tên_bảng AS "Bảng", vòng (((data_length + index_length) / 1024/1024), 2) "Kích thước tính bằng MB" TỪ information_schema.TABLES WHERE table_schema = "my_database_name";

Kết quả được đưa ra là

cơ sở_schedule_line_items | 20111.00

Tôi đã sử dụng điều này chỉ để tính chiều dài dữ liệu và bỏ qua chiều dài chỉ mục

CHỌN tên_bảng AS "Bảng", vòng (((data_length) / 1024/1024), 2) "Kích thước tính bằng MB" TỪ information_schema.TABLES WHERE table_schema = "my_database_name";

và kết quả là

cơ sở_schedule_line_items | 9497,00

Các chỉ số

Index_bslt_actualdate KEY (actual_date),
KEY index_bslt_spsila (loan_base_schedule_id, scheduled_principal_due, scheduled_interest_due, actual_date),
KEY index_bslt_ondate (ON_DATE),
KEY index_bslt_oa (ON_DATE, actual_date),
KEY index_bslt_ol (ON_DATE, loan_base_schedule_id),
KEY index_bslt_oli (ON_DATE, lending_id)

đã được tôi thêm vào, nhưng tôi không chắc chắn hoặc mục đích nào khác được thêm vào. Đây là ứng dụng khá lớn. Bây giờ tôi cần thêm hai chỉ số được đề cập ở trên vì chúng giúp tôi trích xuất một báo cáo bằng cách sử dụng một câu lệnh chọn và tôi thấy rất khó để thêm chúng. Mọi sự trợ giúp sẽ rất được trân trọng

Câu trả lời:


16

Hoạt động thay đổi các bảng lớn được thực hiện theo từng giai đoạn:

  1. Tạo một bảng mới với các trường và chỉ mục cần thiết nói trong DB thử nghiệm (chỉ cấu trúc)
  2. Kết xuất dữ liệu từ bảng hiện có và tải tương tự vào bảng vừa tạo trong DB thử nghiệm
  3. Bây giờ thông báo thời gian chết của bạn :)
  4. Hoán đổi các bảng bằng cách đổi tên - RENAME table ur_db.table_name to test.temp, test.table_name to ur_db.table_name, test.temp to test.table_name; Đây là một hoạt động nguyên tử lấy một phần của giây.
  5. Tải các bản ghi bổ sung vào bảng vừa tạo (các bản ghi xuất hiện sau khi đổ và sau đó tải). Bước này có thể được thực hiện trước Bước: 3 cũng một lần để giảm thời gian chết của bạn.
  6. Và hệ thống của bạn đã hoạt động trở lại

Vài lưu ý:

  1. Bạn không cần phải đánh trực tiếp lược đồ thông tin như thế này, hãy thử sử dụng SHOW TABLE STATUS from db like 'table_name'
  2. Tốc độ của bảng thay đổi ít nhiều được liên kết với tốc độ I / O. Lần trước khi chúng tôi chạy một bảng thay đổi trực tiếp (không có các bước trên), chúng tôi có kích thước bảng 40 GB + mất khoảng 4 giờ. Nếu dữ liệu 20GB của bạn mất nhiều năm, bạn đang làm việc trên một số máy lỗi thời.
  3. Đồng thời bỏ các chỉ mục không mong muốn index_bslt_ondate, index_base_schedule_line_items_loan_base_schedulenhư một số chỉ mục khác có cột bên trái nhất là cột được lập chỉ mục

Xin vui lòng cho tôi biết nếu bạn cần bất kỳ làm rõ về bất kỳ bước nào trong số này.

Chỉnh sửa: Một tập lệnh python đơn giản để tự động hóa quá trình https://github.com/georgecj11/hotswap_mysql_table.git


10

Bạn có thể sử dụng một công cụ như pt-online-giản đồ thay đổi để thêm chỉ mục mà không chặn ứng dụng của bạn. Logic cơ bản như sau:

  • tạo bản sao trống của bảng với chỉ mục mới
  • thêm các kích hoạt vào bảng hiện có để bất kỳ thay đổi nào xảy ra với bảng sẽ được áp dụng cho bản sao của bảng *
  • bắt đầu sao chép các hàng từ bảng cũ sang bảng mới
  • Sau khi sao chép xong, hoán đổi các bảng
  • bỏ cái bàn cũ

* Công cụ không hoạt động nếu có các kích hoạt hiện có trên bàn

Hành vi tráo đổi và thả có thể được điều chỉnh dựa trên các tùy chọn được truyền cho công cụ.

Ngoài ra, có vấn đề với khóa ngoại, vì vậy hãy chắc chắn đọc tài liệu của công cụ để hiểu đầy đủ những gì nó đang làm.

Và tất nhiên, thật khôn ngoan khi đảm bảo bạn có bản sao lưu của bảng để có thể khôi phục nếu cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.