Chỉ có một thứ bạn đang bỏ lỡ. Đặc biệt, nếu bạn đang sử dụng InnoDB, là bạn muốn thêm một cách rõ ràng một mệnh đề ORDER BY trong câu lệnh SELECT của bạn để đảm bảo bạn đang chèn hàng trong khóa chính (clustered index) theo thứ tự:
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id
xem xét loại bỏ chỉ số thứ trên bảng sao lưu nếu chúng không cần thiết. Điều này cũng sẽ tiết kiệm một số tải trên máy chủ.
Cuối cùng, nếu bạn đang sử dụng InnoDB, giảm số lượng các ổ khóa hàng được yêu cầu và chỉ khóa một cách rõ ràng cả hai bảng:
LOCK TABLES product_backup WRITE;
LOCK TABLES product_id READ;
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id;
UNLOCK TABLES;
Các công cụ khóa có thể sẽ không tạo sự khác biệt rất lớn, như khóa hàng là rất nhanh (mặc dù không nhanh như ổ khóa bảng), nhưng kể từ khi bạn hỏi.
Nguồn
2012-06-25 13:06:41
Tôi nghĩ đây là cách tốt nhất. Bằng cách này bạn cũng đang bảo tồn các chỉ mục. –
Tốc độ nhanh đến mức tốt. Tất nhiên bạn có thể trì hoãn việc tạo chỉ mục trên bảng sao lưu cho đến sau khi tất cả dữ liệu đã được sao chép, điều đó sẽ làm tăng đáng kể tốc độ chèn. – fvu
Thật thú vị, cảm ơn. Tôi đã tò mò xung quanh việc sao chép dữ liệu và tự hỏi liệu đây có phải là một cống trên cơ sở dữ liệu hay không (hoặc 'SELECT *' đã ném tôi ra, hoặc nếu phải mất một thời gian dài để xử lý vì cách truy vấn được xây dựng). Nếu đây là một cách có thể chấp nhận được để sao chép dữ liệu trên thì điều đó là tốt. – crmpicco