Tăng tốc độ chèn MySQL với các phân vùng trên MyISAM bằng khóa duy nhất


9

Tôi có một bảng MyISAM lớn (~ 30 triệu hàng). Tại một số điểm, tôi đã chuyển nó sang định dạng hàng cố định, vì vậy bây giờ bảng mất ~ 40Gb trên đĩa và 2Gb cho các chỉ mục. Bảng có một chỉ mục duy nhất và có 100 'chèn vào các truy vấn cập nhật khóa trùng lặp' mỗi giây. Khi bảng phát triển, các phần chèn này ngày càng chậm hơn.

Tôi không chắc chắn, nhưng các phân vùng sẽ giúp tôi tăng tốc độ chèn?

Câu trả lời:


1

Trước hết, ghi đồng thời chắc chắn không phải là một tùy chọn cho lưu trữ MyISAM. Mỗi người trong số họ sẽ khóa toàn bộ một bảng (trừ việc đọc trong một số trường hợp). Nếu InnoDB không phù hợp với bạn, hãy thử TokuDB. Nhưng nó sẽ chậm hơn so với MyISAM vì bản chất giao dịch của công cụ TokuDB (và tất nhiên là InnoDB) (bạn nên viết cùng một dữ liệu ít nhất hai lần: tệp nhật ký và dữ liệu). Ngoài ra, nếu máy chủ của bạn gặp sự cố một ngày nào đó, bạn sẽ đợi hàng giờ cho đến khi bảng MyISAM 40Gb của bạn sửa chữa.

Nếu bạn vẫn muốn tải dữ liệu vào các bảng MyISAM của mình và muốn thực hiện nhanh chóng, tôi có thể khuyên bạn nên sử dụng LOAD DATA INFILEthay vì chèn. Đây là cách nhanh nhất để tải khối lượng lớn dữ liệu vào bảng. Và có, các chỉ mục sẽ làm chậm hiệu suất chèn theo cách theo cấp số nhân.

Một từ về phân vùng: Các câu lệnh INSERT trong MySQL không hỗ trợ cắt tỉa, vì vậy tất cả các phân vùng của bạn sẽ được quét trên mỗi câu lệnh để khớp chỉ mục duy nhất. Ngoài ra, tất cả các phân vùng sẽ bị khóa cho đến khi kết thúc chèn.


Một thú vị hơn động cơ: code.facebook.com/posts/190251048047090/...
GreyWolf

0

Là các truy vấn chèn đồng thời hoặc có nguồn gốc từ cùng một quá trình? Nếu chúng đồng thời, tốt hơn là sử dụng bộ lưu trữ InnoDB cho bảng này vì MyISAM khóa toàn bộ bảng và InnoDB sử dụng khóa hàng. Nếu việc chuyển sang lưu trữ khác không phải là một tùy chọn, bạn có thể thử câu lệnh INSERT DELAYED và một số tối ưu hóa chèn khác . Phân vùng sẽ không giúp trừ khi bạn đặt các phân vùng khác nhau trên các đĩa vật lý khác nhau.


Những chèn này là đồng thời. Nhưng InnoDB quá chậm khi 'chèn vào cập nhật khóa trùng lặp', vì vậy đây không phải là một tùy chọn. Theo như tôi có thể nói IO không phải là nút cổ chai - dung lượng RAM >> kích thước của các bảng, bao gồm các chỉ mục và ghi chú đang bật. Tôi nghĩ vấn đề nằm ở đâu đó trong ổ khóa của mysql nội bộ hoặc một cái gì đó.
d0rc

Chỉ nên sử dụng CHẬM TRÌ HOÃN cho các câu lệnh INSERT chỉ định danh sách giá trị. Máy chủ bỏ qua TRÌ HOÃN cho CHỌN ... CHỌN hoặc XÁC NHẬN ... TRÊN các câu lệnh CẬP NHẬT TỪ KHÓA.
llazzaro

"InnoDB quá chậm" - bạn đã thử điều chỉnh nó một chút chưa? Cài đặt mặc định khá kém.
rvs
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.