Nếu tôi là bạn, tôi sẽ chuyển tất cả dữ liệu sang InnoDB. Khóa bảng / khóa hàng đã được thảo luận bởi nhiều người. Tôi sẽ luôn chọn InnoDB. Tuy nhiên, có một lý do sâu sắc khác để chọn InnoDB ... CÁCH MẠNG .
Mặc dù hầu hết mọi người đều tự hào rằng MyISAM nhanh hơn để đọc, nhưng hầu hết mọi người đều quên rằng nhiều bộ đệm cho MyISAM, được gọi là bộ đệm chính (được đặt bởi key_buffer_size), chỉ lưu trữ các trang chỉ mục từ các tệp .MYI. Nó không bao giờ lưu trữ các trang dữ liệu. Nó có tối đa chính thức 4GB trong Hệ thống 32 bit. 8GB là tối đa tốt nhất cho 64-bit.
Nhóm đệm InnoDB lưu trữ dữ liệu và các trang chỉ mục. Tùy thuộc vào máy chủ mà bạn có, bạn có thể lưu trữ tối đa toàn bộ dữ liệu trong RAM. Bạn có thể điều chỉnh InnoDB cho tối đa 80% RAM và 10% cho DB Conenctions và để lại 10% cho HĐH. Điều này đúng ngay cả đối với các hệ điều hành khác nhau .
Tôi đã khuyến nghị những điều này cho khách hàng của Drupal với thành công tuyệt vời. Nó cũng áp dụng cho Wordpress . Tôi đã cung cấp hỗ trợ DB cho khách hàng với WordPress. Cải tiến tương tự.
Bạn luôn có thể định cấu hình bộ nhớ cho InnoDB hiệu quả hơn để bạn có thể MyISAM nhiều hơn. Luôn luôn có một cách để tweek InnoDB phù hợp với nhu cầu hiệu suất của bạn . Khi dữ liệu của bạn phát triển, cuối cùng nó sẽ trở thành một yêu cầu .
CẬP NHẬT 2011-11-21 11:44 EST
Nếu tập dữ liệu hoàn chỉnh của bạn đủ nhỏ, bạn có thể thực hiện truy vấn CHỌN trên mỗi bảng bạn có ngay sau khi mysql khởi động.
Đối với tất cả các bảng là InnoDB và / hoặc MyISAM, hãy chạy truy vấn này:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')) B
USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
Điều này sẽ xuất ra mọi truy vấn CHỌN có thể bạn cần chạy để triệu tập tất cả các chỉ mục sẽ được tham chiếu. Đặt truy vấn này trong một tệp có tên /root/MakeSelectQueriesToLoad.sql. Chạy tập lệnh và thu thập đầu ra /root/SelectQueriesToLoad.sql. Cuối cùng, chạy nó:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Điều này chắc chắn sẽ tải trước tất cả các trang chỉ mục vào Bộ đệm InnoDB và Bộ đệm ẩn MyISAM. Nếu tất cả dữ liệu của bạn là InnoDB, hãy thực hiện hai thay đổi:
- thay thế
WHERE engine IN ('InnoDB','MyISAM')
bằngWHERE engine='InnoDB'
- thay thế
CONCAT('SELECT ',ndxcollist,' FROM ',
bằngCONCAT('SELECT * FROM ',
Điều này cũng sẽ đưa nhiều trang dữ liệu vào Nhóm đệm InnoDB.
LƯU Ý CUỐI CÙNG: Đảm bảo rằng Bộ đệm InnoDB đủ lớn để chứa tất cả Dữ liệu InnoDB của bạn