Tối ưu hóa cài đặt mặc định của InnoDB


8

Tôi nhìn vào my.ini và thấy các cài đặt mặc định khác nhau. Cơ sở dữ liệu của tôi đang chạy trên một PC độc lập. Tôi muốn tối ưu hóa hiệu suất của InnoDB và MySQL nói chung cho hiệu suất. Không có ràng buộc về không gian đĩa. Tôi nên thay đổi cài đặt mặc định nào để tối ưu hóa để có hiệu suất tốt hơn, độ tin cậy và sao lưu theo thời gian có thể [tính sẵn sàng cao].

Đã chỉnh sửa

Hiện tại, bất cứ khi nào tôi chạy "Tối ưu hóa bảng" thông qua Bảo trì trên Quản trị viên MySQL, nó sẽ hiển thị:

Bảng không hỗ trợ tối ưu hóa, thực hiện tái tạo + phân tích thay thế

trên tất cả các bàn Tất cả các bảng của tôi là InnoDB, nhưng tại sao chúng không hỗ trợ Tối ưu hóa?


mà chỉnh sửa đảm bảo một câu hỏi riêng biệt, imo. Hãy xem tài liệu TỐI ƯU HÓA TABLE: dev.mysql.com/doc/refman/5.5/en/optimize-table.html InnoDB hỗ trợ các lệnh, nhưng quá trình này là khác biệt so với MyISAM
Derek Downey

Câu trả lời:


11

Cách điều chỉnh InnoDB tập trung vào xung quanh

  • Nhóm đệm InnoDB: Nó lưu trữ các trang dữ liệu và trang chỉ mục. Lượng dữ liệu và chỉ mục bạn có thể lưu trữ không phải là một chức năng của các ràng buộc không gian đĩa mà là một chức năng của bộ nhớ và không gian đĩa hiện đang được InnoDB sử dụng.
  • InnoDB MetaData: Theo mặc định, tệp ibdata1 thường chứa mọi thứ và mọi thứ InnoDB. Điều đó sẽ bao gồm các trang dữ liệu, trang chỉ mục, siêu dữ liệu bảng, dữ liệu MVCC .

Đây là một công thức tôi đã sử dụng trong 5 năm qua để tính toán Bộ đệm InnoDB dựa trên không gian đĩa được sử dụng bởi các trang chỉ mục và dữ liệu của InnoDB :

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
  • Sử dụng (CHỌN 0 Power1024) cho byte
  • Sử dụng (CHỌN 1 Power1024) cho KB
  • Sử dụng (CHỌN 2 Power1024) cho MB
  • Sử dụng (CHỌN 3 Power1024) cho GB
  • Sử dụng (CHỌN 4 Power1024) cho TB (Gửi email cho tôi nếu bạn có TerraBytes RAM)

Tất nhiên, tôi đã nói một chức năng của bộ nhớ có sẵn và không gian đĩa hiện đang được InnoDB sử dụng. Từ đây, chỉ cần sử dụng thông thường. Số được đề xuất từ ​​truy vấn trên KHÔNG NÊN BỎ QUA 75% RAM CÀI ĐẶT !!! Đó là quy tắc đơn giản nhất để định cỡ cho Bộ đệm InnoDB.

Bạn cũng nên đặt innodb_flush_method thành O_DIRECT vì nó sẽ cung cấp các bản ghi đồng bộ ổn định của InnoDB. Tôi cũng đã viết một bài về cách tối ưu hóa Dung lượng đĩa cho InnoDB .

Đối với thông báo Bảng không hỗ trợ tối ưu hóa, thực hiện tái tạo + phân tích thay vào đó , lý do tại sao bạn nhận được thông báo lỗi đó là thực tế rằng công cụ lưu trữ là InnoDB. Về mặt cơ học, TỐI ƯU BẢNG chỉ cần sao chép bảng vào bảng tạm thời và thực hiện BẢNG ANALYZE .

Trong thực tế, BẢNG ANALYZE chống lại InnoDB là hoàn toàn vô dụng. Ngay cả khi bạn đã chạy ANALYZE TABLE trên bảng InnoDB, công cụ lưu trữ InnoDB sẽ thực hiện các lần lặn vào chỉ mục cho các xấp xỉ cardinality nhiều lần, do đó, bỏ qua các số liệu thống kê bạn vừa biên dịch. Trên thực tế, Percona đã thực hiện một số thử nghiệm trên ANALYZE TABLE và cũng đi đến kết luận tương tự .

Dưới đây là những bài viết khác tôi đã thực hiện trong năm qua về Điều chỉnh InnoDB


PC của tôi có RAM 2GB và InnoDB_Buffer_Pool_Size theo mặc định được đặt thành 6M. Tôi đã tăng nó lên 500M. Bất kỳ đề xuất?
RPK

Đặt nó 1536M là 1,5G vì đó là 75% RAM đã cài đặt
RolandoMySQLDBA

Tôi đã chạy truy vấn của bạn và nó cho ra 45G. RAM trên máy chủ của tôi là 8G .. Tôi hoàn toàn có phải tăng RAM không? Hoặc có một số điều kiện cho truy vấn trên ..
Stewie

@Stewie Nếu bạn có 45G InnoDB, 60GB RAM là thứ bạn cần nếu bạn có ngân sách. Vì bạn chỉ có 8G, 75% RAM được cài đặt (6G) là đủ.
RolandoMySQLDBA

@RolandoMySQLDBA: bài đăng tuyệt vời! Nhưng tôi không hiểu tại sao trong trường hợp của Stewie, RAM của anh ta chỉ có 8 GB nhưng đầu ra của truy vấn của anh ta có thể lớn hơn 8GB (trong trường hợp này là 45G.) Bạn có thể khai sáng không?
Chubaka

3

Đây là một bài viết cũ hơn về các biến quan trọng để 'điều chỉnh thô'. Điều quan trọng nhất có lẽ làinnodb_buffer_pool_size

Tôi thực sự khuyên bạn nên nâng cấp lên MySQL 5.5 (nếu bạn chưa chạy nó). Họ đã thực hiện khá nhiều thay đổi đối với hiệu suất của InnoDB. Họ thậm chí còn cung cấp một phần chính về cách tối ưu hóa cho InnoDB ngay bây giờ vì đó là công cụ mặc định: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

Đối với các bản sao lưu theo thời gian, bạn sẽ muốn xem nhật ký nhị phân . Điều cơ bản để cho phép điều này là đặt log-binbiến trong my.cnf của bạn


Tôi đã nâng cấp lên MySQL 5.5.
RPK

2

Tối ưu hóa có rất nhiều màu sắc.

Tôi nghĩ bước đầu tiên của bạn là quyết định "tối ưu hóa" nghĩa là gì đối với bạn. Đối với một số người, nó có nghĩa là "truy vấn CHỌN nhanh nhất". Đối với những người khác, điều đó có nghĩa là "sự cân bằng tốt nhất giữa hiệu suất CHỌN và hiệu suất INSERT". Đối với những người khác, "hiệu suất INSERT nhanh nhất".

Bạn cần quyết định tiêu chí của bạn là gì và bạn sẽ cho biết liệu những thay đổi của bạn có giúp ích trước khi bạn bắt đầu điều chỉnh hay không.

Sau đó đặt các tệp cấu hình và tùy chọn khởi động của bạn dưới sự kiểm soát phiên bản và bắt đầu thử nghiệm. Tài liệu có lời khuyên bạn làm theo, và nơi bạn tìm thấy nó. (Lời khuyên thay đổi theo thời gian, vì cơ sở mã và phần cứng thay đổi.) Đặt các tài liệu đó dưới sự kiểm soát phiên bản, quá.

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.