Tôi đang cố gắng tìm ra các yêu cầu bộ nhớ cho các công cụ lưu trữ khác nhau. Tôi có bảng này:Tại sao kích thước bảng InnoDB lớn hơn nhiều so với dự kiến?
CREATE TABLE `mytest` (
`num1` int(10) unsigned NOT NULL,
KEY `key1` (`num1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Khi tôi chèn một số giá trị và sau đó chạy show table status;
tôi nhận được như sau:
+----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | mytest | InnoDB | 10 | Compact | 1932473 | 35 | 67715072 | 0 | 48840704 | 4194304 | NULL | 2010-05-26 11:30:40 | NULL | NULL | latin1_swedish_ci | NULL | | |
Thông báo avg_row_length là 35. Tôi đang bối rối mà InnoDB sẽ không tận dụng tốt hơn về không gian khi tôi chỉ lưu trữ một số nguyên không nullable.
Tôi đã chạy thử nghiệm tương tự này trên myISAM và theo mặc định, myISAM sử dụng 7 byte mỗi hàng trên bảng này. Khi tôi chạy
ALTER TABLE mytest MAX_ROWS=50000000, AVG_ROW_LENGTH = 4;
làm cho myISAM cuối cùng sử dụng chính xác các hàng 5 byte.
Khi tôi chạy cùng một câu lệnh ALTER TABLE cho InnoDB thì avg_row_length không thay đổi.
Tại sao avg_row_length lớn này lại cần thiết khi chỉ lưu trữ int không dấu 4 byte?
Tôi chỉ đọc rằng InnoDB sử dụng không gian bảng cho cả dữ liệu và chỉ mục. điều này có ý nghĩa và có vẻ như đây là lý do tại sao tôi thấy một avg_row_length lớn ... có thể. Tôi cũng phát hiện ra rằng mỗi nút lá lưu trữ ID giao dịch và con trỏ rollback. Vâng, tôi không sử dụng các giao dịch cho mỗi lần và do đó không sử dụng cho dữ liệu này. có cách nào để không lưu trữ các giá trị này không? Bất kỳ cách nào tôi có thể sử dụng InnoDB nhưng làm cho một chút tốt hơn sử dụng lưu trữ? cảm ơn! –
@alessandro: có, hỗ trợ giao dịch cũng làm tăng thêm một số chi phí. Thực tế là bạn không sử dụng các giao dịch không có nghĩa là chúng không được sử dụng: ví dụ, một chuỗi bị giết trong quá trình hoạt động 'UPDATE' dài sẽ quay lại chính xác trong' InnoDB' nhưng không phải trong 'MyISAM'. Hỗ trợ giao dịch là toàn bộ điểm sử dụng 'InnoDB', nếu bạn không cần nó, chỉ cần sử dụng' MyISAM'. – Quassnoi
@Quassnoi: Tôi có ấn tượng rằng MyISAM không phải là "trưởng thành" hoặc sản xuất đã sẵn sàng như InnoDB ... có lẽ đó là một nỗi sợ hãi vô căn cứ. Có bất kỳ khó khăn nào mà MyISAM mang đến khi nói đến việc sao lưu cơ sở dữ liệu ngoài thực tế là MyISAM yêu cầu khóa bàn đầy đủ để đảm bảo tính nhất quán. Tôi không yêu cầu giao dịch và tôi sẽ lưu trữ rất nhiều dữ liệu. Có bất kỳ vấn đề đã biết với MyISAM có thể khiến bạn không sử dụng nó không? –