Tôi đã thử nghiệm khái niệm này một chút tại một công việc trước đây, nơi chúng tôi cần một phương pháp sao chép lược đồ nhanh chóng giữa các máy chủ MySQL.
Thực sự có một chi phí hiệu suất khi bạn chèn vào các bảng có chỉ mục phụ. Các phần chèn cần cập nhật chỉ mục được phân nhóm (hay còn gọi là bảng) và cũng cập nhật các chỉ mục phụ. Bảng càng có nhiều chỉ mục, thì càng gây ra nhiều chi phí cho các lần chèn.
InnoDB có một tính năng được gọi là bộ đệm thay đổi điều này giúp ích một chút bằng cách hoãn cập nhật chỉ mục, nhưng cuối cùng chúng phải được hợp nhất.
Việc chèn vào bảng không có chỉ mục phụ nhanh hơn, vì vậy bạn nên cố gắng trì hoãn việc tạo chỉ mục cho đến khi dữ liệu của bạn được tải xong, như bạn mô tả.
Máy chủ Percona, một nhánh của MySQL, đã thử nghiệm với mysqldump --optimize-keys
quyền mua. Khi bạn sử dụng tùy chọn này, nó sẽ thay đổi đầu ra của mysqldump để có TẠO BẢNG không có chỉ mục, sau đó CHÈN tất cả dữ liệu, rồi CHÈN BẢNG để thêm các chỉ mục sau khi dữ liệu được tải. Xem https://www.percona.com/doc/ percona-server / LATEST / management / innodb_expanded_fast_index_creation.html
Nhưng theo kinh nghiệm của tôi, sự cải thiện thực sự về hiệu suất là rất nhỏ. Vẫn mất một lúc để chèn nhiều hàng, ngay cả đối với các bảng không có chỉ mục. Sau đó, quá trình khôi phục cần chạy BẢNG ALTER để xây dựng các chỉ mục. Điều này mất một lúc cho một bảng lớn. Khi bạn đếm thời gian của INSERT cộng với thời gian thêm để tạo chỉ mục, nó chỉ nhanh hơn một vài phần trăm (một chữ số thấp) so với việc chèn theo cách truyền thống, vào bảng có chỉ mục.
Một lợi ích khác của việc tạo chỉ mục sau xử lý này là các chỉ mục được lưu trữ nhỏ gọn hơn, vì vậy nếu bạn cần tiết kiệm dung lượng đĩa, đó là lý do tốt hơn để sử dụng kỹ thuật này.
Tôi thấy việc khôi phục bằng cách tải nhiều bảng song song sẽ có lợi hơn nhiều đối với hiệu suất .
- Công cụ MySQL 8.0 mới mysqlpump hỗ trợ kết xuất đa luồng.
- Công cụ mã nguồn mở mydumper
hỗ trợ kết xuất đa luồng và cũng có công cụ khôi phục đa luồng, được gọi là
myloader
. Nhược điểm tồi tệ nhất của mydumper / myloader là tài liệu hầu như không tồn tại, vì vậy bạn cần phải là một người dùng dũng cảm mới có thể tìm ra cách chạy nó.
Một chiến lược khác là sử dụng mysqldump --tab
để kết xuất tệp CSV thay vì tập lệnh SQL. Tải hàng loạt tệp CSV nhanh hơn nhiều so với việc thực thi các tập lệnh SQL để khôi phục dữ liệu. Chà, nó kết xuất một tệp SQL cho định nghĩa bảng và một CSV để nhập dữ liệu. Nó tạo các tệp riêng biệt cho mỗi bảng. Bạn phải tạo lại các bảng theo cách thủ công bằng cách tải tất cả các tệp SQL (việc này rất nhanh), sau đó sử dụng mysqlimport
để tải các tệp dữ liệu CSV. Công cụ mysqlimport thậm chí còn có --use-threads
tùy chọn để thực thi song song.
Kiểm tra cẩn thận với các số đề song song khác nhau. Kinh nghiệm của tôi là 4 đề là tốt nhất. Với sự song song lớn hơn, InnoDB trở thành một nút thắt cổ chai. Nhưng trải nghiệm của bạn có thể khác, tùy thuộc vào phiên bản MySQL và khả năng hoạt động của phần cứng máy chủ của bạn.
Phương pháp khôi phục nhanh nhất là khi bạn sử dụng công cụ sao lưu vật lý, phổ biến nhất là Percona XtraBackup . Điều này cho phép sao lưu nhanh chóng và thậm chí khôi phục nhanh hơn. Các tệp đã sao lưu theo đúng nghĩa đen đã sẵn sàng để được sao chép vào vị trí và được sử dụng như các tệp không gian bảng trực tiếp. Nhược điểm là bạn phải tắt Máy chủ MySQL của mình để thực hiện khôi phục.