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


180

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

+13

Nếu bạn muốn có một công cụ cơ sở dữ liệu, hãy sử dụng InnoDB.[Bạn không thể so sánh hai] (https://jeremystein.com/journal/innodb-versus-myisam-no-comparison/). 10 jan. 132013-01-10 15:12:50

112

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 sự phục hồi sự cố tốt hơn trong InnoDB.Tuy nhiên, nó không cóFULLTEXTchỉ 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):

  • InnoDB có khóa cấp hàng, MyISAM chỉ có thể thực hiện khóa cấp bảng đầy đủ.
  • InnoDB đã phục hồi sự cố tốt hơn.
  • MyISAM cóFULLTEXTchỉ mục tìm kiếm, InnoDB đã không cho đến MySQL 5.6 (tháng 2 năm 2013).
  • InnoDB thực hiện các giao dịch, khóa ngoại và ràng buộc mối quan hệ, MyISAM thì không.
  0

Thưa ông, vậy cuối cùng người ta sẽ sử dụng cái gì?MyISAM hay InnoDB?Tôi hoàn toàn bối rối ... trang web của tôi đang sử dụng mysql và tôi cần phải quyết định điều này. 30 aug. 122012-08-30 11:44:30

+2

tùy thuộc vào ứng dụng, viết ra một danh sách với các tính năng bạn cần (ví dụ: tìm kiếm toàn văn bản, khóa ngoại ...) và cố gắng quyết định một (thử đánh giá từng tính năng và sau đó đếm số điểm).bạn sẽ không thể có tất cả nhưng tùy thuộc vào bạn để quyết định tính năng phù thủy là cần thiết nhất. 30 aug. 122012-08-30 12:14:29

+2

Tôi chỉnh sửa bài viết của mình để làm rõ. 23 jul. 132013-07-23 06:24:14

+1

@MathiasLykkegaardLorenzen cảm ơn, đó là một trong những lý do chúng tôi thích stackexchange 25 jul. 132013-07-25 23:37:26

  0

kể từ 'phiên bản 5.6.4' InnoDB hỗ trợ tìm kiếm' FULLTEXT'.https://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html 02 nov. 142014-11-02 04:34:25

  0

InnoDB không nhớ các giá trị gia tăng tự động (nó quên chúng khi khởi động lại). 10 feb. 182018-02-10 03:26:03

  0

@sqlchild, Nếu máy chủ web của bạn hấp thụ dữ liệu từ máy khách, sử dụng InnoDB tốt hơn, tính năng khóa ngoài là điều cần thiết để giữ cho cơ sở dữ liệu của bạn ở trạng thái nhất quán. 03 mar. 182018-03-03 19:08:23


16

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:

  1. InnoDB hỗ trợ giao dịch và khóa ngoại.MyISAM thì không.
  2. MyISAM sử dụng lập chỉ mục toàn văn.
  3. MyISAM thực hiện công việc kém trong việc thực thi tính toàn vẹn dữ liệu.

7

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

  • Khóa cấp hàng
  • Thi hành khóa ngoại
  • Hỗ trợ giao dịch
  • Hiệu suất đạt được trên các hệ thống sử dụng cao
+4

ngoại trừ bản phát hành MySQL mới nhất không còn sử dụng MyISAM làm công cụ mặc định.Trong 5.5 họ đã thay đổi mặc định thành InnoDB :).Và tôi sẽ không đồng ý với việc khái quát hóa rằng InnoDB nói chung chỉ nhận được một "cú đánh hiệu suất".Các bảng InnoDB được thiết kế tốt với lập chỉ mục phù hợp và cài đặt bộ nhớ được cấu hình tốt có thể làm cho bảng InnoDB hoạt động tốt như cùng một lược đồ trong MyISAM 24 jun. 112011-06-24 13:44:30

+3

Trong nhiều tình huống "sử dụng cao", InnoDB thực sự thực hiện [cách tốt hơn] (http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmark-part-1/) so với MyISAM.MyISAM là một công cụ cụ thể cho một vấn đề cụ thể, trong khi InnoDB sẽ phục vụ bạn tốt hơn trong phần lớn các tình huống (do đó tại sao nhóm MySQL biến nó thành công cụ mặc định).Đó là bởi vì MyISAM là công cụ duy nhất trong một thời gian dài mà cộng đồng MySQL đã phát triển thành thói quen sử dụng MyISAM theo mặc định, ngay cả sau khi InnoDB trưởng thành. 15 aug. 112011-08-15 19:53:08

+2

Tìm kiếm FULLTEXT cho InnoDB đã được thêm vào giữa chu kỳ phát triển MySQL 5.6.[URL được trích dẫn] (http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html) hiện cũng bao gồm cả InnoDB. 20 dec. 122012-12-20 06:52:59


26

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 bảo đảm là 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 thực hiện INSERTUPDATE bằng cách sử dụng dữ liệu thực từ người dùng, thì thật khó để 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 , bạn sẽ thực hiện myisamchk một nửa thời gian, phủ nhận mọi hiệu suất tăng ...

(Trải nghiệm cá nhân của tôi: DB 2 terabyte trong MyISAM).


64

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.

MYISAM

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 MyISAM Key Cache (key_buffer_size) được cung cấp cho bộ dữ liệu hiện tại của bạn (the query will cap the recommendation at 4G (4096M). Đối với the query will cap the recommendation at 4G (4096M). 32 bit, 4GB là giới hạn. Đối với 64 bit, 8GB.

InnoDB

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) với 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 là <4G (4096M). Vì mục đích đơ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:

  • Bước 1) Thêm innodb_log_file_size = NNN vào /etc/my.cnf(NNN phải là 25% của innodb_buffer_pool_size hoặc 2047M, tùy theo số nào nhỏ hơn)
  • Bước 2) service mysql stop
  • Bước 3) rm /var/log/mysql/ib_logfile[01]
  • Bước 4) service mysql start (ib_logfile0 và ib_logfile1 được tạo lại)

CẨN THẬN

Ở cuối của cả hai truy vấn là Truy vấn nội tuyến (SELECT 2 PowerOf1024) B

  • (SELECT 0 PowerOf1024) cung cấp Cài đặt tính bằng byte
  • (SELECT 1 PowerOf1024) cung cấp Cài đặt theo 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 Gigabyte
  • Không có quyền hạn nào nhỏ hơn 0 hoặc lớn hơn 3 được chấp nhận

TIẾNG VIỆT

Khô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.

  • Nếu bạn có 2GB RAM và 16GB InnoDB, hãy phân bổ 512M dưới dạng innodb_buffer_pool.
  • Nếu bạn có 2GB RAM và 4GB MyISAM Indexes, hãy phân bổ 512M dưới dạng key_buffer_size.
  • Nếu bạn có 2GB RAM và 4GB MyISAM Indexes và 16GB InnoDB, hãy phân bổ 512M dưới dạng key_buffer_size và 512M dưới dạng innodb_buffer_pool_size.

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ổ, hãy để lại đủ RAM cho Kết nối DB và Hệ điều hành.

  0

Đó là những công thức tồi! 23 jun. 112011-06-23 00:06:29

  0

(Rất tiếc - đừng quên không có đoạn văn) ... Tôi sẽ thêm "câu trả lời". 23 jun. 112011-06-23 00:07:21

  0

Tôi thực sự đã cho @Rick +1 cho câu trả lời của anh ấy liên quan đến môi trường bộ nhớ thấp.Câu trả lời của tôi, thậm chí sử dụng URL từ câu trả lời của anh ấy, đã được xác nhận là chính xác.Từ đây tôi để nó cho cộng đồng DBA.SE đánh giá tất cả các câu trả lời trong ngữ cảnh đầy đủ của nó.Cảm ơn bạn !!! 23 jun. 112011-06-23 02:51:42

  0

Công thức của Rolando cho kích thước bộ đệm là không thực tế.- Không cần 2 sức mạnh.- Không thể có 4GB trên HĐH 32 bit - v.v. .) 23 jun. 112011-06-23 00:13:03

+2

@Rick: Sức mạnh của 2 có nghĩa là hiển thị các câu trả lời theo các đơn vị khác nhau.Thực hiện (CHỌN 2 PowerOfTwo) Đặt Hiển thị câu trả lời theo MB.Thực hiện (CHỌN 3 PowerOfTwo) Đặt Hiển thị theo GB.(CHỌN 1 PowerOfTwo) Hiển thị bằng KB.(CHỌN 0 PowerOfTwo) Hiển thị bằng byte.Đó là những gì (CHỌN 2 PowerOfTwo) làm.Vì vậy, CHỈ cần HIỂN THỊ, không áp đặt bất kỳ giá trị giả định nào trong kiến ​​trúc. 23 jun. 112011-06-23 02:25:59

  0

@Rick: Tài liệu trang web MySQL cho biết 4GB Max cho hệ điều hành 32 bit: Cài đặt tối đa cho phép đối với key_buffer_size là 4GB trên nền tảng 32 bit.Các giá trị lớn hơn 4GB được phép cho các nền tảng 64 bit.Kích thước tối đa hiệu quả có thể ít hơn, tùy thuộc vào RAM vật lý có sẵn và giới hạn RAM trên mỗi quy trình do hệ điều hành hoặc nền tảng phần cứng của bạn áp đặt.Giá trị của biến này cho biết lượng bộ nhớ được yêu cầu.Trong nội bộ, máy chủ phân bổ càng nhiều bộ nhớ càng tốt với số tiền này, nhưng phân bổ thực tế có thể ít hơn. 23 jun. 112011-06-23 02:30:58

  0

@Rick: Đó là những gì URL này nói (http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_key_buffer_size), ngay từ Tài liệu MySQL.Nếu tài liệu sai, vui lòng thông báo cho MySQL (eh Oracle). 23 jun. 112011-06-23 02:32:19

  0

@Rick: Ngay cả URL của bạn (http://mysql.rjweb.org/doc.php/memory) nói rõ: Đầu tiên, HĐH (và phần cứng?) Có thể âm mưu không cho phép bạn sử dụng tất cả 4GB, nếu đó là những gì bạn có.Nếu bạn có nhiều hơn 4GB RAM, phần vượt quá 4GB là _totally_ không thể truy cập và không sử dụng được.Đây chính xác là những gì 4GB chính xác từ tài liệu của MySQL và URL của riêng bạn mà bạn đã trích dẫn. 23 jun. 112011-06-23 02:37:15

+2

@Rick: Bạn biết gì không?Tôi thực sự sẽ cho bạn +1 vì hai lý do rất lớn.1) URL của bạn xác nhận câu trả lời của tôi là chính xác trong đó 4GB là số lớn nhất để gán cho key_buffer_size.2) Câu trả lời của bạn, với URL của bạn, có ý nghĩa đối với máy có bộ nhớ rất thấp.Tôi sẽ cung cấp tín dụng khi tín dụng đáo hạn. 23 jun. 112011-06-23 02:41:27

  0

@Rick: Tôi không có nghĩa là dài dòng, nhưng nếu bạn đã đọc ghi chú cuối cùng từ câu trả lời của tôi, bạn sẽ thấy rằng tôi nói rõ rằng sử dụng 512MB cho innodb_buffer_pool_size và key_buffer_size.Tôi cố gắng bảo thủ với môi trường bộ nhớ thấp.Tôi hoàn toàn biết rằng các công thức như của tôi không phải là tuyệt đối. 23 jun. 112011-06-23 02:48:45


42

InnoDB cung cấp:

  • Giao dịch ACID
  • khóa cấp hàng
  • hạn chế khóa ngoại
  • phục hồi sự cố tự động
  • nén bảng (đọc/ghi)
  • kiểu dữ liệu không gian (không có chỉ mục không gian)

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ố lượng 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:

  • nhanh COUNT(*) s (khi WHERE , GROUP BY hoặc JOIN không được sử dụng)
  • lập chỉ mục toàn văn bản (cập nhật: được hỗ trợ trong InnoDB từ MySQL 5.6)
  • dấu chân đĩa nhỏ hơn
  • nén bảng rất cao (chỉ đọc)
  • Các kiểu và chỉ mục dữ liệu không gian (R-tree) (cập nhật: được hỗ trợ trong InnoDB từ MySQL 5.7)

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.

+2

Tôi đọc câu trả lời của bạn và so sánh nó với những người khác đã ở đây.Bạn là người duy nhất đề cập đến BLOB.Chúng thường được coi là đương nhiên.Yours cũng là người duy nhất nhắc đến myisampack, một trong những anh hùng vô danh của các bảng MyISAM dễ đọc.Hôm nay bạn là +1! 23 aug. 112011-08-23 03:45:37


3

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ữ.

NỔI BẬT

INNODB là công cụ lưu trữ an toàn giao dịch.


4

Bao gồm các thay đổi MySQL 5.6

KỸ THUẬT BẢO QUẢN INNODB:

  • Nó cung cấp đầy đủ ACID (nguyên tử, tính nhất quán, cách ly, độ bền).Đa phiên bản được sử dụng để cách ly các giao dịch khỏi oneanother.
  • InnoDB cung cấp tự động phục hồi sau sự cố của máy chủ MySQL hoặc máy chủ mà máy chủ chạy trên đó.
  • InnoDB hỗ trợ các khóa ngoại và tính toàn vẹn tham chiếu, bao gồm xóa tầng và cập nhật.
  • MySQL 5.6 được xây dựng trên nền tảng của InnoDB được tích hợp hoàn toàn làm công cụ lưu trữ mặc định
  • Chỉ số tối ưu hóa liên tục : Cung cấp độ chính xác được cải thiện của thống kê chỉ số InnoDB và tính nhất quán trên toàn bộ khởi động lại của MySQL.
  • Cắt xén bộ đệm của bảng InnoDB: Để giảm tải bộ nhớ trên các hệ thống với số lượng bảng khổng lồ, InnoDB hiện giải phóng bộ nhớ được liên kết với một bảng đã mở.Một thuật toán LRU chọn các bảng đã đi lâu nhất mà không được truy cập.
  • Hỗ trợ tìm kiếm toàn văn bản: Một loại chỉ mục đặc biệt, chỉ mục FULLTEXT, giúp InnoDB xử lý các truy vấn và hoạt động DML liên quan đến các cột dựa trên văn bản và các từ mà chúng chứa.Các chỉ mục này được biểu diễn vật lý dưới dạng toàn bộ bảng InnoDB.
  • InnoDB dường như nhanh hơn trên Tìm kiếm toàn văn bản so với MyISAM

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.

InnoDB VS MyISAM performance using MySQL 5.6


17

Một chút muộn để trò chơi ... nhưng đây là một post I wrote a few months back khá toàn diện, 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 với 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 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

MyISAM

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, các 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, lệnh OPTIMIZE TABLE 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

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ả các giao dịch SQL và XA, không gian bảng, FULLTEXT và các hoạt động không gian theo tiêu chuẩn OpenGIS. Nó được bao gồm như là 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.

Nĩa

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.