Tôi có một chương trình C khai thác một nguồn dữ liệu khổng lồ (20GB văn bản thô) và tạo các tải INSERT để thực thi trên bảng trống đơn giản (4 cột nguyên với 1 khóa chính). Thiết lập dưới dạng bảng MEMORY
, toàn bộ tác vụ sẽ hoàn thành sau 8 giờ. Sau khi kết thúc, có khoảng 150 triệu hàng tồn tại trong bảng. Tám giờ là một con số hoàn toàn phù hợp với tôi. Đây là giao dịch một lần.Tạo một bảng MySQL 150M hàng lớn
Sự cố xảy ra khi cố gắng chuyển đổi bảng MEMORY
trở lại thành MyISAM
để (A) Tôi sẽ giải phóng bộ nhớ cho các quy trình khác và (B) dữ liệu sẽ không bị giết khi tôi khởi động lại máy tính.
ALTER TABLE memtable ENGINE = MyISAM
Tôi đã cho phép điều này ALTER TABLE
truy vấn chạy trong hơn hai ngày và không được thực hiện. Tôi đã giết nó rồi.
Nếu tôi tạo bảng ban đầu là MyISAM, tốc độ ghi có vẻ rất tệ (đặc biệt là do truy vấn yêu cầu sử dụng kỹ thuật ON DUPLICATE KEY UPDATE
). Tôi không thể tạm thời tắt các phím. Bảng sẽ trở nên lớn hơn 1000 lần nếu tôi đến và sau đó tôi sẽ phải tái xử lý các phím và về cơ bản chạy một GROUP BY trên 150.000.000.000 hàng. Ừm ... không.
Một trong những ràng buộc chính để nhận ra: Truy vấn INSERT UPDATEs ghi lại nếu khóa chính (băm) tồn tại trong bảng đã có.
Khi bắt đầu một nỗ lực nghiêm chỉnh sử dụng MyISAM, tôi nhận được tốc độ thô 1.250 hàng mỗi giây. Khi chỉ số tăng lên, tôi tưởng tượng tỷ lệ này sẽ tăng hơn nữa.
Tôi có 16GB bộ nhớ được cài đặt trong máy. Cách tốt nhất để tạo ra một bảng lớn cuối cùng kết thúc như một bảng MyISAM được lập chỉ mục trên đĩa là gì?
Làm rõ: Có rất nhiều, rất nhiều thông tin cập nhật diễn ra từ truy vấn (INSERT ... ON DUPLICATE KEY UPDATE val=val+whatever
). Đây không phải là, bởi bất kỳ phương tiện, một vấn đề đổ nguyên liệu. Lý do của tôi để thử một bảng MEMORY
ở nơi đầu tiên là để tăng tốc tất cả các tra cứu chỉ mục và thay đổi bảng xảy ra cho mỗi INSERT.
InnoDB sẽ ổn thôi. Điều này rất thông minh ... Tôi thích nó. Cảm ơn bạn đã gửi nhận xét cho tôi. Tôi đánh giá cao nó. :) – brianreavis