InnoDB và MyISAM trong MySQL là gì?


122

Là gì InnoDBMyISAMtrong MySQL?


8
Bản sao của MySql: MyISAM so với Inno DB! , Hoặc bạn có thể đưa ra lựa chọn: stackoverflow.com/search?q=myisam+vs+innodb
OMG Ngựa Non

Đó là công cụ cơ sở dữ liệu ... kavoir.com/2009/09/…
Matthieu

chúng ta có thể sử dụng cả hai công cụ lưu trữ cùng một lúc cho cơ sở dữ liệu của mình không?
user130561 29/09/10

1
Bạn có thể bạn cho họ đồng thời trên các bảng khác nhau, nhưng đối với một bảng cho bạn sẽ cần phải chọn cái nào bạn muốn sử dụng ...
Matthieu

Câu trả lời:


111

InnoDBMYISAM, 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: InnoDBkhóa hàng cụ thể trong bảng và MyISAMkhóa toàn bộ MySQLbảng.

Bạn có thể chỉ định kiểu bằng cách cho MYISAMOR InnoDBtrong khi tạo bảng trong DB.


Câu trả lời rõ ràng và đơn giản.
vadiraj jahagirdar

38

Hãy xem

InnoDBMyISAM

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.


1
chúng ta có thể sử dụng cả hai công cụ lưu trữ cùng một lúc cho cơ sở dữ liệu của mình không?
user130561 29/09/10

2
bạn có thể, vì đối với mỗi bảng, bạn có thể xác định một công cụ lưu trữ khác nhau. một câu hỏi khác là nếu bạn nên. trong tài liệu mysql là một số giải thích về chủ đề này.
nano7

18

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.


Vì vậy, trong khi cài đặt MySQL, chúng ta có cần chỉ định cụ thể công cụ lưu trữ nào sẽ sử dụng làm cơ sở dữ liệu MySQL của mình không?
user130561 29/09/10

3
Như đã đề cập trong bài viết của tôi, mặc định là MyISAM. Nếu bạn muốn sử dụng các tính năng của một công cụ lưu trữ khác, chẳng hạn như INNODB, thì bạn cần phải chỉ định. Điều này không được thực hiện trong khi cài đặt, thay vào đó nó được thực hiện trong quá trình tạo bảng ban đầu.
mluebke

3
Nhưng theo điều này: - dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; Công cụ mặc định là InnoDB.
Harsha

2
Theo dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html : "Công cụ mặc định là InnoDB kể từ MySQL 5.5.5 (MyISAM trước 5.5.5)" Vì vậy, công cụ mặc định bây giờ là InnoDB. Câu trả lời này đã được đăng sau 16 ngày kể từ ngày phát hành chung đầu tiên với InnoDB làm công cụ mặc định;)
SOFe 23/02

6

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:

Cải tiến hiệu suất và khả năng mở rộng InnoDB 1.1


4

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.


3

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


1

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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.