Trước khi bạn quyết định MyISAM hoặc InnoDB, bạn sẽ phải xem qua cả hai Công cụ lưu trữ về cách thức mỗi bộ nhớ cache
MyISAM
Khi đọc, chỉ mục của bảng MyISAM có thể được đọc một lần từ tệp .MYI và được tải trong Bộ nhớ cache khóa MyISAM (có kích thước bằng key_buffer_size ). Làm thế nào bạn có thể làm cho bảng MyISAM .MYD nhanh hơn để đọc? Với cái này:
ALTER TABLE mytable ROW_FORMAT=Fixed;
Tôi đã viết về điều này trong các bài viết trước đây của tôi
InnoDB
OK, còn InnoDB thì sao? InnoDB có thực hiện bất kỳ I / O đĩa nào cho các truy vấn không? Đáng ngạc nhiên, đúng vậy !! Có lẽ bạn đang nghĩ tôi điên khi nói điều đó, nhưng nó hoàn toàn đúng, ngay cả đối với các truy vấn CHỌN . Tại thời điểm này, có lẽ bạn đang tự hỏi "Làm thế nào trên thế giới InnoDB thực hiện I / O đĩa cho các truy vấn?"
Tất cả quay trở lại với InnoDB là một Công cụ lưu trữ giao dịch hoàn toàn ACID . Để cho InnoDB để được giao dịch, nó có để hỗ trợ I
trong ACID
, đó là ly. Kỹ thuật duy trì sự cô lập cho các giao dịch được thực hiện thông qua MVCC, Multiversion Concurrency Control . Nói một cách đơn giản, InnoDB ghi lại dữ liệu trông như thế nào trước khi các giao dịch cố gắng thay đổi chúng. Trường hợp đó được ghi lại? Trong tệp không gian bảng hệ thống, được gọi là ibdata1. Điều đó đòi hỏi I / O đĩa .
SO SÁNH
Vì cả InnoDB và MyISAM đều thực hiện I / O trên đĩa, yếu tố ngẫu nhiên nào quyết định ai nhanh hơn?
- Kích thước của cột
- Định dạng cột
- Bộ nhân vật
- Phạm vi của các giá trị số (yêu cầu INTs đủ lớn)
- Hàng được chia thành nhiều khối (Chuỗi hàng)
- Phân mảnh dữ liệu gây ra bởi
DELETEs
vàUPDATEs
- Kích thước của Khóa chính (InnoDB có Chỉ mục cụm, yêu cầu hai lần tra cứu khóa)
- Kích thước của mục nhập chỉ mục
- Danh sách cứ kéo dài...
TIẾNG VIỆT
Do đó, trong môi trường đọc nhiều, bảng MyISAM có Định dạng hàng cố định có thể vượt trội hơn so với InnoDB đọc ra khỏi Nhóm đệm InnoDB nếu có đủ dữ liệu được ghi vào nhật ký hoàn tác có trong ibdata1 để hỗ trợ hành vi giao dịch áp đặt trên dữ liệu InnoDB. Lập kế hoạch loại dữ liệu, truy vấn và công cụ lưu trữ của bạn thực sự cẩn thận. Khi dữ liệu phát triển, việc di chuyển dữ liệu trở nên rất khó khăn.
Nhân tiện, tôi đã viết một cái gì đó như thế này 5 ngày trước: Làm cách nào để chỉ định giới hạn bộ nhớ cho myQuery?