Là gì InnoDB
và MyISAM
trong MySQL
?
Là gì InnoDB
và MyISAM
trong MySQL
?
Câu trả lời:
InnoDB
và MYISAM
, là các công cụ lưu trữ cho MySQL
.
Hai thứ này khác nhau về cách triển khai khóa: InnoDB
khóa hàng cụ thể trong bảng và MyISAM
khóa toàn bộ MySQL
bảng.
Bạn có thể chỉ định kiểu bằng cách cho MYISAM
OR InnoDB
trong khi tạo bảng trong DB.
Hãy xem
InnoDB là một công cụ lưu trữ cho MySQL, được đưa vào làm tiêu chuẩn trong tất cả các tệp nhị phân hiện tại do MySQL AB phân phối. Cải tiến chính của nó so với các công cụ lưu trữ khác có sẵn để sử dụng với MySQL là hỗ trợ giao dịch tuân thủ ACID
MyISAM là công cụ lưu trữ mặc định cho các phiên bản hệ quản trị cơ sở dữ liệu quan hệ MySQL trước 5.5 1 . Nó dựa trên mã ISAM cũ hơn nhưng có nhiều phần mở rộng hữu ích. Thiếu sót chính của MyISAM là không có hỗ trợ giao dịch. Các phiên bản của MySQL 5.5 trở lên đã chuyển sang công cụ InnoDB để đảm bảo các ràng buộc về tính toàn vẹn tham chiếu và tính đồng thời cao hơn.
Chúng là động cơ lưu trữ.
http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html
MyISAM: Công cụ lưu trữ MySQL mặc định và là công cụ được sử dụng nhiều nhất trong Web, kho dữ liệu và các môi trường ứng dụng khác. MyISAM được hỗ trợ trong tất cả các cấu hình MySQL và là công cụ lưu trữ mặc định trừ khi bạn đã định cấu hình MySQL để sử dụng một công cụ khác theo mặc định.
InnoDB: Một công cụ lưu trữ an toàn giao dịch (tương thích với ACID) cho MySQL có khả năng cam kết, khôi phục và khôi phục sự cố để bảo vệ dữ liệu người dùng. Khóa cấp độ hàng InnoDB (không chuyển sang khóa mức độ chi tiết thô hơn) và các lần đọc không khóa nhất quán theo kiểu Oracle giúp tăng hiệu suất và đồng thời nhiều người dùng. InnoDB lưu trữ dữ liệu người dùng trong các chỉ mục được phân cụm để giảm I / O cho các truy vấn phổ biến dựa trên khóa chính. Để duy trì tính toàn vẹn của dữ liệu, InnoDB cũng hỗ trợ các ràng buộc toàn vẹn tham chiếu FOREIGN KEY.
Tôi muốn nói thêm rằng có khả năng chỉ định một công cụ lưu trữ cụ thể cho mỗi bảng là một trong những điểm mạnh chính của MySQL (bên cạnh việc dễ sử dụng và hiệu suất tốt mà không cần chỉnh sửa). Đối với tất cả các hoạt động cần giao dịch, chỉ cần gắn bó với InnoDB. Tuy nhiên, MyISAM thực sự có thể tăng tốc mọi thứ khi các giao dịch không cần thiết trong một số tình huống nhất định - và yêu cầu ít dung lượng đĩa và RAM hơn so với InnoDB.
Điều đó nói rằng, InnoDB đang trở nên tốt hơn mọi lúc:
MyISAM không tuân theo ACID trái ngược với InnoDB tuân theo các giao dịch để duy trì tính toàn vẹn của dữ liệu.
MyISAM hỗ trợ chèn đồng thời: Nếu một bảng không có khối trống ở giữa tệp dữ liệu, bạn có thể CHÈN các hàng mới vào đó cùng lúc các luồng khác đang đọc từ bảng. MySqlDoc
Đó là lý do tại sao, MyISAM nhanh hơn và chiếm ít dung lượng hơn. Ví dụ: MySQL MyISAM Storage Engine không hỗ trợ tranactions. các ràng buộc của MySQL MYISAM Có một bit được gọi là chèn đồng thời Theo mặc định, biến được đặt thành 1 và các phần chèn đồng thời được xử lý như vừa mô tả. Nếu nó được đặt thành 0, chèn đồng thời sẽ bị tắt. Nếu nó được đặt thành 2, thì cho phép chèn đồng thời ở cuối bảng ngay cả đối với các bảng đã xóa hàng. Một câu lệnh INSERT có thể được thực hiện để thêm các hàng vào cuối bảng với lựa chọn cùng một lúc nếu không có lỗ / hàng bị xóa ở giữa bảng (tại thời điểm chèn đồng thời).
Mức cách ly mặc định trong mysql InnoDB là "Đọc lặp lại". Đối với MyISAM, không có giao dịch nào. InnoDB sử dụng khóa mức hàng trong khi MyISAM chỉ có thể sử dụng khóa mức bảng, đó là lý do tại sao InnoDB có chế độ khôi phục sự cố tốt hơn MyISAM. Người ta phải có được khóa cấp bảng trong MyISAM theo cách thủ công nếu muốn tránh các hiệu ứng đồng thời.
InnoDB là một công cụ lưu trữ giao dịch của MySQL trong khi MyISAM là một công cụ lưu trữ phi giao dịch. Nói cách khác, InnoDB tuân theo các thuộc tính ACID để duy trì tính toàn vẹn của dữ liệu nhưng MyISAM không tuân theo các thuộc tính ACID do đó không duy trì tính toàn vẹn của dữ liệu.
Trong bảng InnoDB (giao dịch), các thay đổi giao dịch có thể dễ dàng hoàn tác nếu yêu cầu khôi phục. Tuy nhiên, không thể hoàn tác các thay đổi được thực hiện đối với bảng MyISAM (không giao dịch) khi cần khôi phục giao dịch.
Ví dụ: bạn muốn chuyển tiền từ tài khoản séc sang tài khoản tiết kiệm. Điều này được thực hiện bởi một giao dịch bao gồm 5 truy vấn.
1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;
Giả sử, quá trình bị lỗi ở bước 4. Nếu một bảng InnoDB được sử dụng ở đây, việc khôi phục sẽ hoàn tác các thay đổi và bạn được cứu khỏi nguy cơ mất tiền. Theo nghĩa đen, bảng không biết về bất kỳ sự cố nào vì các thay đổi sẽ không được chuyển đến bảng trừ khi bước 5 được thực hiện thành công.
Nhưng trong trường hợp của bảng MyISAM, người ta không thể hoàn tác các thay đổi trong giao dịch khi quá trình khôi phục được gọi hoặc nếu có sự cố dẫn đến giao dịch không thành công. Điều này có nghĩa là, nếu giao dịch bị lỗi ở bước 3, tiền sẽ bị trừ vào tài khoản séc của bạn. Nhưng tiền sẽ không được thêm vào tài khoản tiết kiệm của bạn.
Ví dụ lịch sự: "MySQL Hiệu suất cao: Tối ưu hóa, Sao lưu và Nhân rộng" - Sách của Arjen Lentz, Derek J. Balling, Jeremy Zawodny, Peter Zaitsev và Vadim Tkachenko
Khi máy chủ MySQL của bạn gặp sự cố, dữ liệu có thể được khôi phục từ một tập hợp các bảng MyISAM dễ dàng hơn nhiều so với từ tệp giao dịch InnoDB lớn đó. Mỗi bảng MyISAM có một tệp riêng biệt và nếu không có thao tác ghi nào được thực hiện vào bảng này trong sự cố - nó sẽ hoàn toàn không bị ảnh hưởng. Trong trường hợp của InnoDB, toàn bộ tệp giao dịch của toàn bộ máy chủ MySQL phải được lập chỉ mục lại hoặc bất cứ điều gì nó làm sau sự cố. Điều đó có thể trở nên khá lộn xộn.
InnoDB là mặc định KHÔNG phải myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDB là công cụ lưu trữ MySQL mặc định. Trừ khi bạn đã định cấu hình một công cụ lưu trữ mặc định khác, Câu lệnh CREATE TABLE không có mệnh đề ENGINE = tạo một bảng InnoDB "