Tại sao sử dụng innodb_file_per_table?
Bởi vì việc quản lý cá nhân dễ dàng hơn vì nó có thể được thực hiện ở cấp độ tệp. Điều này có nghĩa là ngay cả khi máy chủ ngừng hoạt động, bạn vẫn có thể sao chép dữ liệu bằng cách sao chép các tệp bảng trong khi sử dụng không gian bảng dùng chung có nghĩa là sao chép mọi thứ có thể lớn không cần thiết hoặc tìm cách để máy chủ chạy để trích xuất dữ liệu ( bạn thực sự không muốn trích xuất dữ liệu theo cách thủ công với trình soạn thảo hex).
Ai đó đã cảnh báo rằng bạn không thể đơn giản sao chép và dán .ibd
tệp từ máy chủ này sang máy chủ khác. Điều này có thể đúng, nhưng nó không nên áp dụng cho các bản sao lưu trên cùng một máy chủ (tôi đang sử dụng thuật ngữ sao lưu ở đây theo nghĩa truyền thống là tạo một bản sao; nghĩa là không thay đổi mạnh mẽ toàn bộ). Hơn nữa, ibdata1
được tự động tạo lại khi khởi động (như đã thấy trong bước xóaibdata1
của hầu hết các chuyển đổi mã hóa thành hướng dẫn tập tin trên mỗi bảng). Như vậy, bạn không cần phải sao chép ibdata1
thêm vào các .ibd
tệp của mình (và các tệp tương ứng .frm
, v.v.).
Nếu cố gắng để phục hồi một bảng bị mất, nó phải là đủ để sao chép nó .ibd
và .frm
tập tin, cũng như information_schema
(đó là nhiều nhỏ hơn ibdata1
). Bằng cách đó, bạn có thể đặt chúng vào một máy chủ giả và trích xuất bảng của bạn mà không phải sao chép toàn bộ, đồ sộ.
Tuy nhiên, yêu cầu cho hiệu suất tốt hơn là nghi vấn. Tập hợp với innodb_file_per_table, cần nhiều thao tác I / O đĩa hơn; và điều này rất có ý nghĩa trong các ràng buộc phức tạp THAM GIA và NGOẠI TỆ.
Không có gì đáng ngạc nhiên, hiệu suất sẽ phụ thuộc hoàn toàn vào (các) cơ sở dữ liệu cụ thể được sử dụng. Một người sẽ có (thậm chí rất nhiều) kết quả khác nhau từ người khác.
Đúng là sẽ có nhiều thao tác I / O đĩa hơn với tệp trên mỗi bảng, nhưng chỉ nhiều hơn một chút . Hãy suy nghĩ về cách hệ thống hoạt động.
Bạn sẽ nhận thấy rằng khi máy chủ đang chạy, bạn không thể di chuyển các tệp dữ liệu vì máy chủ có các thẻ điều khiển mở cho chúng. Điều này là bởi vì khi nó khởi động, nó mở chúng và để chúng mở. Nó không mở và đóng chúng cho từng truy vấn riêng lẻ.
Như vậy, chỉ có một số hoạt động I / O nữa khi bắt đầu, khi máy chủ khởi động; không phải trong khi nó đang chạy Hơn nữa, trong khi mỗi .ibd
tệp riêng lẻ có chi phí riêng (chữ ký tệp, cấu trúc, v.v.), chúng được lưu trong bộ nhớ và không được đọc lại cho mỗi truy vấn. Hơn nữa, các cấu trúc tương tự được đọc ngay cả với một không gian bảng được chia sẻ, do đó hầu như không có bất kỳ bộ nhớ nào (nếu có).
Liệu innodb_file_per_table có ảnh hưởng đến hiệu suất tốt hơn của mysql không?
Trên thực tế, nếu có bất cứ điều gì, hiệu suất trong thực tế có thể tồi tệ hơn .
Khi sử dụng một không gian bảng được chia sẻ, các hoạt động đọc và ghi đôi khi có thể / thường được kết hợp để máy chủ đọc một mẫu dữ liệu từ nhiều bảng trong một lần ibdata
.
Tuy nhiên, nếu dữ liệu được trải ra giữa nhiều tệp, thì nó phải thực hiện một thao tác I / O riêng cho từng tệp riêng lẻ.
Tất nhiên điều này một lần nữa hoàn toàn phụ thuộc vào cơ sở dữ liệu trong câu hỏi; tác động hiệu suất trong thế giới thực sẽ phụ thuộc vào kích thước, tần suất truy vấn và phân mảnh bên trong của không gian bảng được chia sẻ. Một số người có thể nhận thấy một sự khác biệt lớn trong khi những người khác có thể không thấy bất kỳ tác động nào cả.
Không gian bảng được chia sẻ trên ibdata đơn; làm thế nào các không gian bảng chuyên dụng cho các bảng riêng biệt có thể tiết kiệm không gian đĩa?
Nó không. Nếu bất cứ điều gì, nó làm tăng việc sử dụng đĩa một số.
Tôi không có cơ sở dữ liệu 60 GB để kiểm tra, nhưng cơ sở dữ liệu cá nhân của tôi có chứa cài đặt WordPress và một vài bảng nhỏ để sử dụng cá nhân và kiểm tra phát triển có trọng lượng ~ 30 MB trong khi sử dụng không gian bảng dùng chung. Sau khi chuyển đổi nó thành tệp trên mỗi bảng, nó tăng lên ~ 85 MB. Ngay cả khi bỏ mọi thứ và nhập lại, nó vẫn> 60MB.
Sự gia tăng này là do hai yếu tố:
Các tối thiểu tuyệt đối kích thước cho ibdata1
là-vì một lý do-10MB, ngay cả khi bạn không có gì nhưng information_schema
được lưu trữ trong đó.
Với một không gian bảng được chia sẻ, chỉ ibdata1
có chi phí chung như chữ ký tệp, siêu dữ liệu, v.v., nhưng với mỗi bảng, mỗi .ibd
tệp riêng lẻ có tất cả những thứ đó. Điều này có nghĩa là tổng số (ngay cả với giả thuyết <10 MB ibdata1
) sẽ có phần lớn hơn ít nhất:
GetTotalSizeofOverhead() * GetNumTables()
Rõ ràng những thứ này sẽ không tăng rất nhiều (trừ khi bạn đang sử dụng máy chủ giới hạn kích thước cơ sở dữ liệu của bạn hoặc lưu trữ chúng trên ổ đĩa flash, v.v.), nhưng dù sao chúng cũng tăng lên và bằng cách chuyển bảng ( mọi ) sang tệp -per-bàn bạn có thể thu nhỏ ibdata1
xuống còn 10MB, tổng cộng sẽ luôn luôn nhiều hơn so với trước đây.