2011-07-03 41 views
8

Thỉnh thoảng tôi được hỏi về một số cuộc phỏng vấn: InnoDB có những lợi ích gì đối với MyISAM và khi MyISAM tốt hơn InnoDB? Đó là tất cả rõ ràng về phần đầu tiên của câu hỏi: InnoDB là giao dịch tuân thủ, chặn hàng cấp thay vì chặn cấp bảng, hỗ trợ khóa ngoài và một số người khác, những điểm này chỉ đến với tâm trí một cách vô tư.Khi MyISAM tốt hơn InnoDB?

Nhưng khi MyISAM thực sự tốt hơn so với InnoDB?

Trả lời

13

MyISAM tốt hơn InnoDB khi bạn không cần những tính năng nâng cao và tốc độ lưu trữ quan trọng hơn các mối quan tâm khác. MyISAM cũng cho phép tìm kiếm toàn văn bản được thực hiện bên trong chính cơ sở dữ liệu, thay vì cần truy vấn kết quả và sau đó tìm kiếm chúng dưới dạng mảng hoặc bất kỳ thứ gì trong ứng dụng của bạn.

InnoDB là lựa chọn hợp lý nếu bạn cần lưu trữ dữ liệu với độ trung thực cao với các tương tác và mối quan hệ phức tạp. MyISAM là một lựa chọn hợp lý nếu bạn cần lưu hoặc tải một số lượng lớn các bản ghi trong một khoảng thời gian ngắn.

Tôi sẽ không khuyên bạn sử dụng MyISAM cho dữ liệu quan trọng. Thật tuyệt vời cho việc ghi nhật ký hoặc nhận xét các trường hoặc bất cứ điều gì mà bạn không đặc biệt quan tâm nếu một bản ghi biến mất thành nether xoắn. InnoDB rất phù hợp khi bạn quan tâm đến dữ liệu của mình, không cần tìm kiếm nhanh và để sử dụng MySQL. Cũng cần lưu ý rằng InnoDB hỗ trợ khóa cấp hàng, trong khi MyISAM chỉ hỗ trợ khóa cấp bảng - có nghĩa là trong nhiều tình huống phổ biến, InnoDB có thể nhanh hơn đáng kể do có nhiều truy vấn thực thi song song hơn.

Điểm mấu chốt: Sử dụng InnoDB trừ khi bạn hoàn toàn phải sử dụng MyISAM. Ngoài ra, hãy phát triển dựa trên PostgreSQL và tận dụng tối đa cả hai.

+1

Nó vẫn còn phụ thuộc. Nếu bạn cần đảm bảo ACID, thì ** MyIASM không dành cho bạn **. Ngay cả khi bạn cần tốc độ. –

+0

Thực ra chỉ sửa đổi bài đăng của tôi thành hiệu ứng đó. Như tôi đã đề cập đến trong văn bản đã chỉnh sửa, tôi không thể thực sự coi việc sử dụng MySQL trong bất kỳ điều gì là cực kỳ quan trọng. –

+0

Hãy để bên này bắt đầu https://lxadm.com/MySQL:_Converting_all_tables_in_all_databases_from_MyISAM_to_InnoDB – Luka

4

MyISAM không hỗ trợ các giao dịch (và những thứ khác được đề cập) để nó có thể hoạt động nhanh hơn. MyISAM là một cách để đạt được hiệu suất cao hơn trong những tình huống đó khi bạn không cần những tính năng này.

+1

"Các tính năng này" là mọi thứ tạo RDBMS thành RDBMS: [ACID] ​​(http://en.wikipedia.org/wiki/Acid) (Đó là một chút của một hyperbole, nhưng vẫn ...) –

+2

Tin tưởng tôi, khi bạn cần thêm hiệu năng, hãy bỏ các tính năng đó của RDBMS-es thường là con đường để đi. Kiểm tra các giải pháp NoSQL phổ biến hiện tại và kể lại những gì bạn cần về sự cần thiết của ACID. –

+0

vấn đề ở đây là MySQL giảm chúng theo những cách làm tổn hại đến khả năng thực hiện công việc mà nó được quảng cáo để thực hiện. MyISAM nổi tiếng vì ăn dữ liệu vì lý do bí truyền hoặc không rõ, và các giải pháp NoSQL phổ biến đang quản lý để giảm logic quan hệ mà không có chức năng giết người. –

2

Có một vài tính năng mà MySQL chỉ thực hiện cho MyISAM (chẳng hạn như lập chỉ mục toàn văn gốc).

Điều đó nói rằng, InnoDB vẫn thường tốt hơn cho hầu hết các ứng dụng sản xuất.

+1

đó cũng là một kịch bản hợp lệ, mặc dù một công cụ tìm kiếm bên ngoài (lucene, sphinx) có lẽ là một giải pháp tốt hơn để sử dụng trong các trường hợp này –

1

Ngoài ra: Tìm kiếm toàn văn bản trong mySQL chỉ được hỗ trợ trong bảng myISAM.

3

MyISAM hỗ trợ toàn văn, như đã đề cập, nhưng cũng hỗ trợ loại bảng MERGE. Điều này rất tiện lợi khi bạn có một bảng lớn và muốn "hoán đổi" các phần lưu trữ của nó theo định kỳ. Hãy suy nghĩ về dữ liệu ghi nhật ký hoặc báo cáo mà bạn muốn giữ lại quý và/hoặc năm trước. MyISAM xử lý một lượng lớn dữ liệu như thế này tốt hơn, khi bạn chủ yếu chèn và hiếm khi cập nhật hoặc xóa.

Hiệu suất của InnoDB giảm khá nhanh chóng và đáng kể khi bạn không thể vừa với các chỉ mục trong bộ nhớ. Nếu khóa chính của bạn không phải là số (tức là tăng tự động), thì bạn có thể muốn suy nghĩ lại bằng cách sử dụng InnoDB. Khóa chính được sao chép cho mọi chỉ mục trên một bảng InnoDB. Vì vậy, nếu bạn có một khóa chính lớn và một vài chỉ mục khác, bảng InnoDB của bạn sẽ rất lớn rất nhanh.

+1

Có nguy cơ nghe có vẻ như một bản ghi fanboy bị hỏng - đây là lý do tại sao mỗi khi tôi thực hiện cuộc gọi tôi phát triển với PostgreSQL. Việc thực hiện phân vùng bảng thật tuyệt vời. –

0

MyISAM có cấu trúc rất đơn giản, khi so sánh với InnoDB. Không có phiên bản hàng, có một tệp cho mỗi bảng và các hàng được lưu trữ tuần tự.Tuy nhiên, trong khi nó hỗ trợ chèn đồng thời (SELECT và 1 INSERT có thể chạy cùng nhau), nó cũng có các khóa mức bảng (nếu có 2 INSERT trên cùng một bảng, 1 phải đợi). Ngoài ra, UPDATE và DELETEs chậm vì cấu trúc của các tệp dữ liệu.

MyISAM không hỗ trợ giao dịch hoặc khóa ngoại.

Nói chung, MyISAM nên tốt hơn nếu bạn làm việc theo xu hướng chung (vì vậy bạn không quan tâm đến tính chính xác của các hàng riêng lẻ) và dữ liệu được cập nhật vào ban đêm hoặc không bao giờ. Ngoài ra, nó cho phép di chuyển các bảng riêng lẻ từ máy chủ này sang máy chủ khác, thông qua hệ thống tập tin.

InnoDB hỗ trợ đồng thời rất tốt và giao dịch. Có một hỗ trợ phong nha cho fulltext và hỗ trợ gần như phong nha cho các phím nước ngoài.

Các vấn đề liên quan