Sự khác biệt giữa InnoDB và MyISAM là gì?


17

Tôi đang sử dụng MySQL làm cơ sở dữ liệu cho dự án web hiện tại của mình. Tôi chưa quen với MySQL. Vui lòng giải thích cho tôi sự khác biệt giữa InnoDB và MyISAM.


vui lòng thêm tagg MySQL nữa :)
Johan

Điều này không thuộc về stackoverflow?
ripper234

@ ripper234. Hai phiên bản tốt hơn của bài đăng này (nhiều nền tảng hơn; trình diễn nhiều nghiên cứu trước) tồn tại trên SO: stackoverflow.com/q/12614541/209139stackoverflow.com/q/20148/209139 .
TRiG

Câu trả lời:


14

ISAM = Phương pháp truy cập tuần tự được lập chỉ mục và về cơ bản là một tệp phẳng (đối với những DBA có thể nhớ, nghĩ Btrieve hoặc B-Tree). Đó là một công nghệ rất cũ - nhưng đừng để điều đó làm bạn thất vọng khi sử dụng nó. Bởi vì đó là một tệp phẳng (nhiều hơn về sau), nó không liên quan và do đó không phải là RDBMS, và do đó phù hợp hơn trong một số trường hợp.

InnoDB là RDBMS đầy đủ như bạn rất có thể quen thuộc. MyISAM có thể xuất hiện quan hệ thông qua một lớp khác được thêm vào đầu duy trì các liên kết, logic và tính toàn vẹn tham chiếu của bạn.

ISAM là tuyệt vời nếu bạn có RẤT NHIỀU hồ sơ (như, 20 triệu) và các hồ sơ chủ yếu là độc lập (nghĩa là bạn không cần phải thực hiện nhiều liên kết để lấy dữ liệu liên quan). Nó phụ thuộc rất nhiều vào các chỉ mục và nếu bạn không có chỉ mục phù hợp, hãy chuẩn bị cho thời gian truy vấn rất dài. Trường hợp cụ thể: Chúng tôi đã có một bảng ISAM Btrieve với các bản ghi 20M + và để thực hiện truy xuất và lọc dữ liệu dựa trên một chỉ mục chính xác là gần như ngay lập tức. Sử dụng chỉ số sai theo nghĩa đen là 15 phút.

InnoDB là tuyệt vời cho nếu bạn có nhiều liên kết quan hệ. Bảng A tham chiếu một trường trong Bảng B, tham chiếu Bảng C và D. InnoDB có thể tìm nạp các bản ghi này bằng cách sử dụng tất cả các loại phương thức nối đẹp (tham gia băm, v.v.), trong khi cơ sở dữ liệu ISAM sẽ phải chạy nhiều truy vấn phụ cho mỗi một truy vấn hàng và khớp các hồ sơ bằng tay.

Bạn thực sự sẽ phải làm một khóa học về cơ sở dữ liệu nếu bạn muốn nhiều chi tiết hơn thế!


ISAM cũng quan hệ như mọi thứ khác, nó chỉ không được tối ưu hóa cho nó.
LapTop006

cảm ơn 4 mô tả ngắn gọn của bạn. Bây giờ về cơ bản tôi đã bị xóa

5

Cơ bản nhất là InnoDB là giao dịch. MyIsam không. MyIsam thường nhanh hơn một chút, vì vậy nếu bạn không cần các giao dịch thường là đặt cược tốt nhất của bạn. Để biết mô tả chi tiết, bạn nên đọc tài liệu MySQL.


2

Ngày nay, trừ khi bạn đang sử dụng bảng cho dữ liệu kiểu nhật ký (nhiều hơn nữa là CHỌN, không có giao dịch), InnoDB thường nhanh hơn, đáng tin cậy hơn, có nhiều tính năng hơn, v.v.

Tính năng duy nhất khác mà MyISAM có là tìm kiếm toàn văn bản, rất tốt cho sử dụng cơ bản, nhưng hầu hết mọi người sử dụng một số từ Lucene cho bất cứ điều gì nghiêm trọng.

Dù bằng cách nào bạn cũng phải điều chỉnh MySQL vì mặc định về cơ bản được đặt cho một pentium 32 MB được chia sẻ với các dịch vụ khác.


2

Một chút muộn để trò chơi ... nhưng đây là một bài viết khá toàn diện tôi đã viết vài tháng trước , kể chi tiết về sự khác biệt chính giữa MYISAM và InnoDB. Lấy một tách (và có thể là bánh quy), và thưởng thức.


Sự khác biệt chính giữa MyISAM và InnoDB là ở tính toàn vẹn tham chiếu và giao dịch. Ngoài ra còn có sự khác biệt khác như khóa, rollback và tìm kiếm toàn văn.

Tính toàn vẹn tham chiếu

Tính toàn vẹn tham chiếu đảm bảo rằng mối quan hệ giữa các bảng vẫn nhất quán. Cụ thể hơn, điều này có nghĩa là khi một bảng (ví dụ: Danh sách) có khóa ngoại (ví dụ: ID sản phẩm) trỏ đến một bảng khác (ví dụ: Sản phẩm), khi các cập nhật hoặc xóa xảy ra với bảng trỏ, các thay đổi này được xếp theo liên kết bàn. Trong ví dụ của chúng tôi, nếu một sản phẩm được đổi tên, các khóa ngoại của bảng liên kết cũng sẽ cập nhật; nếu một sản phẩm bị xóa khỏi bảng 'Sản phẩm', mọi danh sách trỏ đến mục đã xóa cũng sẽ bị xóa. Hơn nữa, bất kỳ danh sách mới nào cũng phải có khóa ngoại đó trỏ đến mục nhập hợp lệ, hiện có.

InnoDB là một DBMS quan hệ (RDBMS) và do đó có tính toàn vẹn tham chiếu, trong khi MyISAM thì không.

Giao dịch & nguyên tử

Dữ liệu trong một bảng được quản lý bằng cách sử dụng các câu lệnh Ngôn ngữ thao tác dữ liệu (DML), chẳng hạn như CHỌN, CHERTN, CẬP NHẬT và XÓA. Một nhóm giao dịch hai hoặc nhiều câu lệnh DML cùng nhau thành một đơn vị công việc, do đó toàn bộ đơn vị được áp dụng hoặc không có câu lệnh nào trong số đó.

MyISAM không hỗ trợ các giao dịch trong khi InnoDB thì có.

Nếu một thao tác bị gián đoạn trong khi sử dụng bảng MyISAM, thao tác đó sẽ bị hủy ngay lập tức và các hàng (hoặc thậm chí dữ liệu trong mỗi hàng) bị ảnh hưởng vẫn bị ảnh hưởng, ngay cả khi thao tác không hoàn thành.

Nếu một hoạt động bị gián đoạn trong khi sử dụng bảng InnoDB, vì nó sử dụng các giao dịch có tính nguyên tử, bất kỳ giao dịch nào chưa hoàn thành sẽ không có hiệu lực, vì không có cam kết nào được thực hiện.

Khóa bảng vs Khóa hàng

Khi một truy vấn chạy trên bảng MyISAM, toàn bộ bảng mà nó đang truy vấn sẽ bị khóa. Điều này có nghĩa là các truy vấn tiếp theo sẽ chỉ được thực hiện sau khi kết thúc hiện tại. Nếu bạn đang đọc một bảng lớn và / hoặc có các thao tác đọc và ghi thường xuyên, điều này có thể có nghĩa là một lượng lớn các truy vấn.

Khi một truy vấn chạy trên bảng InnoDB, chỉ các hàng có liên quan bị khóa, phần còn lại của bảng vẫn có sẵn cho các hoạt động CRUD. Điều này có nghĩa là các truy vấn có thể chạy đồng thời trên cùng một bảng, miễn là chúng không sử dụng cùng một hàng.

Tính năng này trong InnoDB được gọi là đồng thời. Cũng giống như đồng thời, có một nhược điểm lớn áp dụng cho một phạm vi các bảng được chọn, trong đó có một chi phí chuyển đổi giữa các luồng nhân và bạn nên đặt giới hạn cho các luồng nhân để ngăn máy chủ dừng lại .

Giao dịch & Rollback

Khi bạn chạy một hoạt động trong MyISAM, các thay đổi được đặt; trong InnoDB, những thay đổi đó có thể được khôi phục. Các lệnh phổ biến nhất được sử dụng để kiểm soát các giao dịch là CAMIT, ROLLBACK và SAVEPOINT. 1. CAM KẾT - bạn có thể viết nhiều hoạt động DML, nhưng các thay đổi sẽ chỉ được lưu khi CAM KẾT được thực hiện 2. ROLLBACK - bạn có thể loại bỏ mọi hoạt động chưa được cam kết 3. SAVEPOINT - đặt một điểm trong danh sách các hoạt động mà hoạt động ROLLBACK có thể quay trở lại

độ tin cậy

MyISAM không cung cấp tính toàn vẹn dữ liệu - Lỗi phần cứng, tắt máy không sạch và các hoạt động bị hủy có thể khiến dữ liệu bị hỏng. Điều này sẽ yêu cầu sửa chữa đầy đủ hoặc xây dựng lại các chỉ mục và bảng.

Mặt khác, InnoDB sử dụng nhật ký giao dịch, bộ đệm ghi đôi và kiểm tra tự động và xác thực để ngăn ngừa tham nhũng. Trước khi InnoDB thực hiện bất kỳ thay đổi nào, nó sẽ ghi lại dữ liệu trước khi giao dịch vào tệp không gian bảng hệ thống có tên ibdata1. Nếu có sự cố, InnoDB sẽ tự động chuyển qua phát lại các nhật ký đó.

Lập chỉ mục FULLTEXT

InnoDB không hỗ trợ lập chỉ mục FULLTEXT cho đến khi phiên bản MySQL 5.6.4. Khi viết bài đăng này, nhiều phiên bản MySQL của nhà cung cấp dịch vụ lưu trữ chia sẻ vẫn dưới 5.6.4, điều đó có nghĩa là lập chỉ mục FULLTEXT không được hỗ trợ cho các bảng InnoDB.

Tuy nhiên, đây không phải là lý do hợp lệ để sử dụng MyISAM. Tốt nhất nên đổi sang nhà cung cấp dịch vụ lưu trữ hỗ trợ các phiên bản cập nhật của MySQL. Không phải là bảng MyISAM sử dụng lập chỉ mục FULLTEXT có thể được chuyển đổi thành bảng InnoDB.

Phần kết luận

Tóm lại, InnoDB nên là công cụ lưu trữ mặc định của bạn. Chọn MyISAM hoặc các loại dữ liệu khác khi chúng phục vụ một nhu cầu cụ thể.


1

Nói chung, nguyên tắc chung là, nếu bạn muốn tốc độ, hãy sử dụng MyISAM và nếu bạn muốn sự ổn định, hãy sử dụng InnoDB. Một cái gì đó để làm với nguyên tử nếu tôi nhớ chính xác.


3
Excecpt điều đó không còn đúng nữa, InnoDB thực sự nhanh hơn trong hầu hết các trường hợp.
LapTop006

1
ai đó có thể thêm một liên kết một số điểm chuẩn hoặc một cái gì đó ...?
Johan
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.