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


245

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


23
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 .
Jeremy Stein

Mặc dù nhiều câu trả lời dưới đây là chính xác, nhưng chúng không làm mọi thứ rõ ràng, IMHO. Trang web này thực hiện và điểm chính: InnoDB là khóa cấp hàng, MyISAM là khóa cấp bảng. Điều này có nghĩa là, nói chung, MyISAM sẽ tốt hơn cho OLAP (phân tích, chủ yếu là đọc) và InnoDB sẽ tốt hơn cho OLTP (giao dịch, chủ yếu là viết hoặc ít nhất là viết nhiều).
Mike Williamson

Câu trả lời:


159

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ó 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ó FULLTEXTcác chỉ mục tìm kiếm, InnoDB 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.

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

3
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 (cố gắng xếp hạng từng tính năng và sau đó đếm đ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.
poelinca

2
Tôi chỉnh sửa bài viết của mình để làm rõ.
Mathias Lykkegaard Lorenzen

1
@MathiasLykkegaardLorenzen cảm ơn, đó là một trong những lý do chúng tôi thích stackexchange
poelinca

như version 5.6.4InnoDB hỗ trợ FULLTEXTtìm kiếm. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
mơ mộng

85

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

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 ) đượ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:

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


Đó là những công thức tồi!
Rick James

(Rất tiếc - đừng quên không có đoạn văn) ... Tôi sẽ thêm "câu trả lời".
Rick James

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. - 4GB trên một hệ điều hành 32-bit là không thể - vv Dưới đây là tóm tắt của tôi về những gì để đặt chúng vào: mysql.rjweb.org/doc.php/memory (. Nó đề cập đến các thiết lập khác nhau có ảnh hưởng đến việc sử dụng bộ nhớ)
Rick James

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

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

60

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 BYhoặc JOINkhô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:

  • nhanh COUNT(*)s (khi WHERE, GROUP BYhoặc JOINkhô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.


5
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 có thể đọc nhanh. Hôm nay bạn là +1!
RolandoMySQLDBA

2
Ví dụ sẽ là một bảng chỉ đọc được nén trong đó bạn có các bản cập nhật không thường xuyên cho nó bằng cách thay thế hoàn toàn bảng.
dabest1

30

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 INSERTUPDATEsử 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 myisamchkmộ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).


29

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

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

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

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
Cảm ơn, thực sự nhiều thông tin và tóm tắt rõ ràng.
informatik01

18

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.

Hết hạn - InnoDB hiện có FULLTEXTSPATIAL. InnoDB tốt cho cả tải nặng và ghi nặng.
Rick James

8

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

5
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 "thành tích hiệu quả". 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
TechieGurl

3
Trong nhiều tình huống "sử dụng cao", InnoDB thực sự hoạt động tốt hơn 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.
Nick Chammas

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 bây giờ cũng bao gồm cả InnoDB.
Max Webster

5

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.


5

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ô lập các giao dịch với nhau.
  • 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 bớt 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 MyISAMEngine 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.

Hiệu suất InnoDB VS MyISAM bằng MySQL 5.6


2

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, 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 TABLElệ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

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, FULLTEXTchỉ 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.

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.

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.