Sự khác biệt chính giữa InnoDB và MyISAM là gì?
Sự khác biệt chính giữa InnoDB và MyISAM là gì?
Câu trả lời:
Sự khác biệt lớn đầu tiên tôi thấy là InnoDB thực hiện khóa cấp hàng trong khi MyISAM chỉ có thể thực hiện khóa cấp bảng. Bạn sẽ tìm thấy phục hồi sự cố tốt hơn trong InnoDB. Tuy nhiên, nó không có FULLTEXT
chỉ mục tìm kiếm cho đến v5.6, cũng như MyISAM. InnoDB cũng thực hiện các giao dịch, khóa ngoại và ràng buộc mối quan hệ trong khi MyISAM thì không.
Danh sách có thể đi xa hơn một chút. Tuy nhiên, cả hai đều có những ưu điểm độc đáo về lợi ích và nhược điểm của họ đối với nhau. Mỗi người trong số họ phù hợp hơn trong một số tình huống hơn các kịch bản khác.
Vì vậy, để tóm tắt ( TL; DR ):
FULLTEXT
các chỉ mục tìm kiếm, InnoDB cho đến MySQL 5.6 (tháng 2 năm 2013).version 5.6.4
InnoDB hỗ trợ FULLTEXT
tìm kiếm. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Một sự khác biệt lớn khác chưa được đề cập là cách bộ nhớ đệm cho mỗi công cụ lưu trữ được thực hiện.
Cơ chế chính được sử dụng là bộ đệm chính. Nó chỉ lưu trữ các trang chỉ mục từ các tập tin .MYI. Để kích thước bộ đệm chính của bạn, hãy chạy truy vấn sau:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;
Điều này sẽ cung cấp Cài đặt được đề xuất cho Bộ nhớ cache khóa MyISAM ( key_buffer_size ) được cung cấp cho tập dữ liệu hiện tại của bạn ( truy vấn sẽ giới hạn mức khuyến nghị ở mức 4G (4096M). Đối với HĐH 32 bit, 4GB là giới hạn. Đối với 64 bit, 8GB.
Cơ chế chính được sử dụng là Bộ đệm InnoDB. Nó lưu trữ dữ liệu và các trang chỉ mục từ các bảng InnoDB được truy cập. Để định kích thước Bộ đệm InnoDB của bạn, hãy chạy truy vấn sau:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
Điều này sẽ đưa ra Cài đặt được đề xuất cho kích thước của Bộ đệm InnoDB ( innodb_buffer_pool_size ) được cung cấp cho tập dữ liệu hiện tại của bạn.
Đừng quên thay đổi kích thước Tệp Nhật ký InnoDB (ib_logfile0 và ib_logfile1). Mã nguồn MySQL đặt giới hạn kích thước kết hợp của tất cả các tệp nhật ký InnoDB phải <4G (4096M). Để đơn giản, chỉ cần hai tệp nhật ký, đây là cách bạn có thể kích thước chúng:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 và ib_logfile1 được tạo lại)Ở cuối của cả hai truy vấn là Truy vấn nội tuyến
(SELECT 2 PowerOf1024)
B
(SELECT 0 PowerOf1024)
đưa ra Cài đặt tính bằng byte(SELECT 1 PowerOf1024)
đưa ra Cài đặt trong Kilobytes(SELECT 2 PowerOf1024)
cung cấp Cài đặt tính bằng Megabyte(SELECT 3 PowerOf1024)
cung cấp Cài đặt tính bằng GigabyteKhông có thay thế cho lẽ thường. Nếu bạn có bộ nhớ hạn chế, hỗn hợp các công cụ lưu trữ hoặc kết hợp chúng, bạn sẽ phải điều chỉnh cho các tình huống khác nhau.
Kịch bản có thể là vô tận !!!
Hãy nhớ rằng, bất cứ điều gì bạn phân bổ cho, hãy để lại đủ RAM cho Kết nối DB và Hệ điều hành.
InnoDB cung cấp:
Trong InnoDB, tất cả dữ liệu liên tiếp ngoại trừ văn bản và BLOB có thể chiếm tối đa 8.000 byte. Lập chỉ mục toàn văn không có sẵn trong InnoDB cho đến khi MySQL 5.6 (tháng 2 năm 2013). Trong InnoDB, COUNT(*)
s (khi WHERE
, GROUP BY
hoặc JOIN
không được sử dụng) thực thi chậm hơn trong MyISAM vì số hàng không được lưu trữ bên trong. InnoDB lưu trữ cả dữ liệu và chỉ mục trong một tệp. InnoDB sử dụng nhóm bộ đệm để lưu trữ cả dữ liệu và chỉ mục.
MyISAM cung cấp:
COUNT(*)
s (khi WHERE
, GROUP BY
hoặc JOIN
không được sử dụng)MyISAM có khóa cấp bảng, nhưng không khóa cấp hàng. Không có giao dịch. Không có phục hồi sự cố tự động, nhưng nó cung cấp chức năng sửa chữa bảng. Không có ràng buộc khóa ngoại. Các bảng MyISAM thường có kích thước nhỏ gọn hơn trên đĩa khi so sánh với các bảng InnoDB. Các bảng MyISAM có thể được giảm thêm kích thước bằng cách nén bằng myisampack nếu cần, nhưng trở thành chỉ đọc. MyISAM lưu các chỉ mục trong một tệp và dữ liệu trong một tệp khác. MyISAM sử dụng bộ đệm chính cho các chỉ mục bộ đệm và để lại việc quản lý bộ đệm dữ liệu cho hệ điều hành.
Nhìn chung, tôi muốn giới thiệu InnoDB cho hầu hết các mục đích và MyISAM cho các mục đích chuyên dụng. InnoDB hiện là công cụ mặc định trong các phiên bản MySQL mới.
Một điều nữa: bạn có thể sao lưu các bảng InnoDB chỉ bằng cách chụp nhanh hệ thống tệp. Sao lưu MyISAM yêu cầu sử dụng mysqldump và không được đảm bảo nhất quán (ví dụ: nếu bạn chèn vào bảng cha mẹ và bảng con, bạn có thể chỉ tìm thấy hàng của bảng con trong bản sao lưu của mình).
Về cơ bản, nếu bạn có một bản sao khác của dữ liệu và chỉ lưu vào bộ nhớ cache trong MySQL, ví dụ như cho phép một phương tiện truy cập chuẩn từ trang web PHP, thì MyISAM vẫn ổn (nghĩa là tốt hơn tệp CSV phẳng hoặc tệp logfile để truy vấn và truy cập đồng thời). Nếu cơ sở dữ liệu là "bản sao chính" của dữ liệu, nếu bạn đang sử dụng INSERT
và UPDATE
sử dụng dữ liệu thực từ người dùng, thì thật ngu ngốc khi sử dụng bất cứ thứ gì ngoài InnoDB, ở bất kỳ quy mô nào MyISAM đều không đáng tin cậy và khó quản lý, bạn Sẽ làm myisamchk
một nửa thời gian, phủ nhận bất kỳ hiệu suất tăng ...
(Trải nghiệm cá nhân của tôi: DB 2 terabyte trong MyISAM).
Một chút muộn của 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 đả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.
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.
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 truy vấn hiện tại kết thúc. 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 .
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
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ý đó.
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 thay đổi thành 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.
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ể.
Theo kinh nghiệm của tôi, sự khác biệt đáng kể nhất là cách mỗi động cơ xử lý khóa. InnoDB sử dụng khóa hàng trong khi MyISAM sử dụng khóa bảng. Theo nguyên tắc thông thường, tôi sử dụng InnoDB để viết các bảng nặng và MyISAM để đọc các bảng nặng.
Sự khác biệt quan trọng khác bao gồm:
FULLTEXT
và SPATIAL
. InnoDB tốt cho cả tải nặng và ghi nặng.
Tôi có xu hướng xem MyISAM là lựa chọn bảng 'mặc định' cho MySQL, vì vậy tôi sẽ chỉ ra sự khác biệt cho hầu hết người dùng InnoDB
MYISAM
MYISAM cung cấp khóa cấp bảng, tìm kiếm FULLTEXT. MYISAM có cột AUTO_INCREMENTED linh hoạt nhất xử lý tất cả các công cụ lưu trữ. MYISAM không hỗ trợ giao dịch.
NỔI BẬT
INNODB là công cụ lưu trữ an toàn giao dịch. INNODB có các khả năng cam kết, khôi phục và khôi phục sự cố. INNODB hỗ trợ tính toàn vẹn tham chiếu khóa ngoài.
Bao gồm các thay đổi MySQL 5.6
KỸ THUẬT BẢO QUẢN INNODB:
Vì vậy, không có điểm nào trong việc sử dụng MyISAM
Engine nếu bạn đã được nâng cấp lên 5.6, nếu không thì đừng chờ nâng cấp lên MySQL 5.6.
MyISAM là một công cụ lưu trữ cho MySQL. Trước MySQL 5.5, nó là công cụ lưu trữ mặc định cho MySQL. Nó dựa trên công cụ lưu trữ ISAM cũ hơn. MyISAM được tối ưu hóa cho các môi trường có hoạt động đọc nặng và ít ghi hoặc không có gì cả. Lý do MyISAM cho phép đọc nhanh là cấu trúc các chỉ mục của nó: mỗi mục nhập trỏ đến một bản ghi trong tệp dữ liệu và con trỏ được bù từ đầu tệp. Cách này có thể được đọc nhanh chóng, đặc biệt là khi định dạng bị CỐ ĐỊNH. Do đó, các hàng có chiều dài không đổi. Một khu vực điển hình trong đó người ta có thể thích MyISAM là kho dữ liệu, vì nó liên quan đến các truy vấn trên các bảng rất lớn và việc cập nhật các bảng như vậy được thực hiện khi cơ sở dữ liệu không được sử dụng (thường là vào ban đêm). Việc chèn cũng rất dễ dàng, bởi vì các hàng mới được thêm vào cuối tệp dữ liệu. Tuy nhiên, thao tác xóa và cập nhật có nhiều vấn đề hơn: xóa phải để lại một khoảng trống, hoặc độ lệch của các hàng sẽ thay đổi; điều tương tự cũng xảy ra với các bản cập nhật, vì chiều dài của các hàng trở nên ngắn hơn; nếu bản cập nhật làm cho hàng dài hơn, hàng bị phân mảnh. Để chống phân mảnh các hàng và yêu cầu không gian trống,OPTIMIZE TABLE
lệnh phải được thực thi. Do cơ chế đơn giản này, thông thường chỉ số thống kê MyISAM khá chính xác. Những nhược điểm lớn khác của MyISAM là không có hỗ trợ giao dịch và khóa ngoại.
InnoDB là một công cụ lưu trữ cho MySQL. MySQL 5.5 và sau đó sử dụng nó theo mặc định. Nó cung cấp các tính năng giao dịch tuân thủ ACID tiêu chuẩn, cùng với hỗ trợ khóa ngoài (Tính toàn vẹn tham chiếu khai báo). Nó thực hiện cả giao dịch SQL và XA, không gian bảng, FULLTEXT
chỉ mục và các hoạt động không gian theo tiêu chuẩn OpenGIS. Nó được bao gồm dưới dạng tiêu chuẩn trong hầu hết các nhị phân được phân phối bởi MySQL AB, ngoại lệ là một số phiên bản OEM. Phần mềm này được cấp phép kép bởi Tập đoàn Oracle; nó được phân phối theo Giấy phép Công cộng GNU, nhưng cũng có thể được cấp phép cho các bên muốn kết hợp InnoDB trong phần mềm độc quyền.
MariaDB có một công cụ lưu trữ có tên là Aria, được mô tả là "sự thay thế an toàn cho sự cố với MyISAM". MariaDB và Percona Server sử dụng một nhánh của InnoDB được gọi là XtraDB theo mặc định. XtraDB được duy trì bởi Percona. Các thay đổi của Oracle InnoDB thường được nhập vào XtraDB và một số sửa lỗi và các tính năng bổ sung được thêm vào.