2011-11-21 31 views
18

Trong cơ sở dữ liệu MySQL của tôi, có một bảng có 2.000.000 bản ghi. Bây giờ, tôi muốn chèn thêm 6.000.000 bản ghi mới vào bảng này.MySQL tắt và bật các phím

Đẩy nhanh tiến độ chèn, tôi mặc dù tôi nên sử dụng vô hiệu hóa/kích hoạt các phím như sau:

ALTER TABLE cars DISABLE KEYS; 

INSERT INTO cars ... 
... 
... 
INSERT INTO cars ... 

ALTER TABLE search_all_values ENABLE KEYS; 

OPTIMIZE TABLE cars; 

Nhưng tôi bằng cách nào đó cảm thấy rằng, sự vô hiệu hóa/kích hoạt phím sẽ có ý nghĩa hơn để được sử dụng cho bảng trống chèn.

Trong trường hợp của tôi, tôi đã có 2.000.000 bản ghi trong bảng, khi ENABLE KEYS, mysql sẽ tạo lại tất cả các chỉ mục (bao gồm các bản ghi hiện có và bản ghi mới được thêm) mà có thể sẽ không tạo ra chèn dữ liệu hiệu quả toàn bộ trong trường hợp của tôi. Khi tạo lại tất cả các chỉ mục sẽ mất nhiều thời gian và có thể như vậy OPTIMIZE TABLE

Tôi muốn hỏi ý kiến ​​của bạn về tôi và tôi có thể chèn dữ liệu hiệu quả trong trường hợp của mình không?

+0

Bạn có chắc chắn rằng cập nhật quan trọng là một nút cổ chai? – abcde123483

+1

Đó là lo lắng của tôi và có ai đó có cùng một lo lắng ở đây http://forums.mysql.com/read.php?21,68820,68939#msg-68939 – Mellon

+0

Dù sao, những chỉ mục đó sẽ được tạo khi bạn bật lại . Hãy thử làm một chèn bul chứ không phải hàng/hàng và cũng làm một số liệu thống kê cập nhật và xem nếu đó là cải thiện bất cứ điều gì. – Rahul

Trả lời

1

Việc lập chỉ mục các khóa mới sẽ mất một thời gian. Bạn có thể quyết định xem bạn có muốn thực hiện tất cả cùng một lúc (vô hiệu hóa nó lần đầu) hay từng lần một (bằng cách giữ nguyên trạng thái đó và cho phép chỉ mục khi mỗi bản ghi được thêm vào)

I ' d đi cho sau này, không vô hiệu hóa các phím của bạn. Nếu bạn lo sợ nhấn mạnh máy chủ nhiều, bạn có thể thử chèn theo lô, ví dụ: chỉ một số lượng chèn nhất định mỗi phút.

+0

@ mlitn, cách tối ưu hóa bảng sau khi chèn dữ liệu, bước này có cần thiết không? – Mellon

39

Bạn chắc chắn phải chọn phương pháp tiếp cận dựa trên loại động cơ ... tối ưu hóa for MyISAM hoặc for InnoDB.

Gần đây, chúng tôi đã chạy điểm chuẩn so sánh các cách khác nhau để chèn dữ liệu và đo thời gian từ trước khi chèn và cho đến khi tất cả các chỉ mục được khôi phục hoàn toàn. Nó nằm trên một cái bàn trống, nhưng chúng tôi đã sử dụng tới 10 triệu hàng.

MyISAM với LOAD DATA INFILEALTER TABLE ... ENABLE/DISABLE KEYS được trao tay trong thử nghiệm của chúng tôi (trên hệ thống Windows 7, MySQL 5.5.27 - bây giờ chúng tôi đang thử trên hệ thống Linux).

CÁC BẬT BẬT và DISABLE không hoạt động đối với InnoDB, chỉ là MyISAM. Đối với InnoDB, hãy sử dụng SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; nếu bạn chắc chắn dữ liệu của mình không chứa các bản sao (đừng quên đặt chúng thành 1 sau khi quá trình tải lên hoàn tất).

Tôi không nghĩ rằng bạn cần OPTIMIZE TABLE sau khi chèn hàng loạt - các hàng MySQL được sắp xếp theo thứ tự chèn và chỉ mục được tạo lại. Không có "phân mảnh thêm" bằng cách thực hiện chèn hàng loạt.

Hãy bình luận nếu tôi đã thực hiện các lỗi thực tế.

CẬP NHẬT: Theo kết quả kiểm tra gần đây và đầy đủ của chúng tôi, lời khuyên cho các phím DISABLE/ENABLE là sai.

Một đồng nghiệp đã một chương trình chạy nhiều xét nghiệm khác nhau - một bảng với InnoDB/MyISAM điền sẵn và trống rỗng, lựa chọn và chèn tốc độ với LOAD DATA LOCAL, INSERT INTO, REPLACE INTOUPDATE, trên "dày đặc" và bảng "phân mảnh" (Tôi không hoàn toàn chắc chắn như thế nào, tôi nghĩ rằng nó đã được dọc theo dòng DELETE FROM ... ORDER BY RAND() LIMIT ... với một hạt giống cố định vì vậy nó vẫn còn so sánh) và kích hoạt và diasabled chỉ số.

Chúng tôi đã thử nghiệm nó với nhiều phiên bản MySQL khác nhau (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) trên Windows và Linux (mặc dù không có cùng phiên bản trên cả hai hệ điều hành). MyISAM chỉ thắng khi bàn trống. InnoDB nhanh hơn khi dữ liệu đã có mặt và thường hoạt động tốt hơn (trừ hdd-space - MyISAM nhỏ hơn trên đĩa).

Tuy nhiên, để thực sự hưởng lợi từ nó, bạn phải tự kiểm tra - với các phiên bản khác nhau, cài đặt cấu hình khác nhau và rất nhiều kiên nhẫn - đặc biệt liên quan đến những mâu thuẫn kỳ lạ (5.0.97 nhanh hơn 5.5.27) cùng một cấu hình - chúng tôi vẫn đang tìm kiếm nguyên nhân). Những gì chúng tôi đã tìm thấy là rằng DISABLE KEYSENABLE KEYS là bên cạnh vô giá trị và đôi khi vô hại nếu bạn không bắt đầu với một bảng trống.

+1

Đây là một câu trả lời thực sự tuyệt vời. Cảm ơn bạn đã nghiên cứu kỹ lưỡng! – pinkgothic

+0

Hmm, nỗ lực tốt, nhưng tôi sẽ nghi ngờ kết luận vì sẽ không có kết quả kiểm tra biến thể lớn nào cho thấy có ** rất nhiều yếu tố không rõ ở đây? – Pacerier