Nếu bạn chủ yếu có các bảng MyISAM, bạn nên tăng bộ đệm chèn số lượng lớn . Đây là những gì Tài liệu MySQL nói về việc thiết lập hàng loạt_insert_buffer_size :
MyISAM sử dụng bộ đệm giống như cây đặc biệt để chèn số lượng lớn nhanh hơn cho CHỌN ... CHỌN, XÁC NHẬN ... GIÁ TRỊ (...), (...), ... và LOAD DATA INFILE khi thêm dữ liệu vào dữ liệu không trống những cái bàn. Biến này giới hạn kích thước của cây bộ đệm theo byte trên mỗi luồng. Đặt nó thành 0 sẽ vô hiệu hóa tối ưu hóa này. Giá trị mặc định là 8MB.
Có hai điều bạn cần làm
1) Thêm nó vào /etc/my.cnf
[mysqld]
bulk_insert_buffer_size=512M
2) Đặt giá trị toàn cầu cho nó
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
Nếu bạn không có đặc quyền đặt số lượng lớn_insert_buffer_size trên toàn cầu, thì hãy làm điều này
service mysql restart
Tất nhiên, điều này không dành cho InnoDB.
Từ một góc độ khác, cho dù các bảng là InnoDB hay MyISAM, nếu các chỉ mục lớn hơn bảng, bạn có thể có quá nhiều chỉ mục. Tôi thường đánh giá cao rằng việc tải lại MyqAM mysqldump sẽ mất gấp 3 lần thời gian mysqldump thực hiện. Tôi cũng đánh giá cao rằng việc tải lại một mysqldump của InnoDB sẽ mất 4 lần miễn là mysqldump thực hiện.
Nếu bạn vượt quá tỷ lệ 4: 1 để tải lại mysqldump, bạn chắc chắn có một trong hai vấn đề:
- quá nhiều chỉ số
- chỉ mục quá lớn do cột lớn
Bạn có thể đo kích thước dữ liệu của mình bằng công cụ lưu trữ bằng cách này:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
Xem các chỉ mục có lớn nhất bằng dữ liệu hay thậm chí lớn hơn không
Bạn cũng có thể xem xét việc vô hiệu hóa ghi nhật ký nhị phân như thế này:
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
trước khi tải lại tập lệnh