Nghiêm khắc từ quan điểm của MySQL, tôi có đề xuất về cách cải thiện bộ đệm dữ liệu / chỉ mục cho Trường hợp MySQL.
Hãy nhớ rằng có hai Công cụ lưu trữ chính cho MySQL
Cơ chế lưu trữ của họ là khác nhau. Có một số thứ bạn có thể làm để điều chỉnh cho Storage Engine mà bạn chọn.
MyISAM
MyISAM chỉ lưu trữ các trang chỉ mục. Nó không bao giờ lưu trữ dữ liệu. Bạn có thể thực hiện hai điều để cải thiện I / O cho các bảng MyISAM.
Cải thiện MyISAM # 1
Bất kỳ bảng MyISAM nào có các cột VARCHAR đều có thể được chuyển đổi bên trong thành CHAR mà không cần chạm vào thiết kế ban đầu. Giả sử bạn có một bảng có tên mydb.mytable và bạn muốn cải thiện I / O cho nó, hãy thực hiện như sau:
ALTER TABLE mydb.mytable ROW_FORMAT=Fixed;
Điều này sẽ tăng kích thước của bảng 60% -100% nhưng sẽ mang lại hiệu suất tăng 20-30% trong I / O mà không thay đổi bất cứ điều gì khác . Tôi đã viết về điều này trước đây trong DBA StackExchange:
Cải thiện MyISAM # 2
Bạn cần tăng MyISAM Key Cache (có kích thước bằng key_buffer_size ). Chạy truy vấn này, xin vui lòng:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql','performance_schema')) AA ) A,
(SELECT 2 PowerOf1024) B;
Điều này sẽ cho bạn thấy key_buffer_size lý tưởng dựa trên tập dữ liệu hiện tại của bạn.
InnoDB
InnoDB lưu trữ cả dữ liệu và chỉ mục. Nếu bạn đã chuyển đổi tất cả dữ liệu của mình sang InnoDB và hiện đang chạy WordPress từ cơ sở dữ liệu của InnoDB, bạn cần phải định kích thước Bộ đệm InnoDB của mình (có kích thước bằng innodb_buffer_pool_size ). Chạy truy vấn này, xin vui lòng:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+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 PowerOf1024) B;
Điều này sẽ cho bạn thấy key_buffer_size lý tưởng dựa trên tập dữ liệu hiện tại của bạn.
Dự kiến
Nếu bạn dự đoán rằng tập dữ liệu của bạn sẽ tăng gấp 20 lần, chỉ cần nhân lên gấp bội những gì truy vấn này đề xuất cho 20. Giả sử tập dữ liệu MyISAM của bạn là 15MB và 3MB là tổng chỉ số của bạn. Nếu bạn ước tính rằng bạn sẽ có số lượng dữ liệu gấp 20 lần, hãy đặt key_buffer_size thành 60MB như thế này trong /etc/my.cnf:
[mysqld]
key_buffer_size=60M
sau đó khởi động lại MySQL. Điều tương tự sẽ được áp dụng cho Nhóm đệm InnoDB.
Nếu tất cả dữ liệu của bạn là InnoDB, bạn cần thực hiện Dọn dẹp toàn bộ cơ sở hạ tầng InnoDB mà tôi đã đăng trong StackOverflow .