Có phải là thông lệ để trộn các bảng InnoDB và MyISAM trên cùng một máy chủ không?


21

Tôi đã có một cơ sở dữ liệu duy nhất khoảng 4,5 GB chạy trên máy chủ có RAM 8GB. Phần lớn các bảng là MyIsam (khoảng 4,3 GB), nhưng tôi sẽ sớm chuyển đổi một số trong số chúng thành InnoDB. (Đây sẽ là một quá trình chậm, tập trung vào các bảng viết nhiều nhất lúc đầu).

Có điều gì sai khi chạy một máy chủ chuyên dụng nơi tồn tại cả hai loại công cụ lưu trữ không?


Is there anything wrong with running a dedicated server where both types of storage engines exist? Có thể viết lại thành Multiple types?
Giăng

Lý do duy nhất tôi nói 'cả hai' là vì câu hỏi này là về hai động cơ chính được cấu hình để 'tinh chỉnh'. Tôi đang cố gắng bỏ qua các loại động cơ khác như MEMORY hoặc MERGE, những thứ này không phổ biến đến mức afaik không phải là đối tượng của điều chỉnh hiệu suất.
Derek Downey

Câu trả lời:


18

Không có gì sai khi sử dụng nhiều công cụ lưu trữ trên cùng một máy vật lý, miễn là bạn hiểu được ưu và nhược điểm của từng công cụ. Có các cân nhắc về hiệu suất, giới hạn tính năng và trường hợp sử dụng cho tất cả các loại lưu trữ plugin.

Ví dụ: nếu bạn có một bảng nhỏ ghi 90%, bạn có thể chọn MyISAM. Nếu dữ liệu có thể được phục hồi dễ dàng và đó là một bảng nhỏ, giả sử để xếp hàng, bạn có thể chọn Bộ nhớ. Nếu bạn có một bảng đọc 90% và dữ liệu phải có ở đó khi bạn tìm nó, thì có lẽ bạn sẽ chọn một công cụ lưu trữ hỗ trợ các giao dịch và nguyên tử có thể định cấu hình, như InnoDB. Nếu bạn muốn truy cập thông qua hệ thống tệp không làm hỏng dữ liệu, bạn có thể chọn CSV.

Tuy nhiên, bạn có thể sử dụng một cách an toàn nhiều công cụ lưu trữ trong cùng một lược đồ cũng như máy chủ vật lý.

Tuy nhiên, để tôi lưu ý rằng bộ đệm của bạn đóng một vai trò trong toàn bộ mớ hỗn độn này. Nếu bạn sử dụng cả MyISAM và InnoDB, bạn sẽ cần cẩn thận rằng key_buffer và innodb_buffer_pool của bạn không tranh cãi. Điều này sẽ có kế hoạch cẩn thận từ phía bạn, nhưng đó là những gì chúng tôi làm.


4
+1 Một trường hợp sử dụng phổ biến khác là MyISAM cho các bảng yêu cầu tìm kiếm toàn văn bản và InnoDB cho tất cả các bảng khác.
Asaph

@Aseph: Ngay cả tại thời điểm nhận xét của bạn, InnoDB đã hỗ trợ các chỉ mục Fulltext .
BlueRaja - Daniel Pflughoeft

2
^ ^ ^ ^ "Các tính năng của MySQL 5.6" không phải là GA cho đến 2013 / 02-05
ngẫu nhiên

1
@randymelder Câu trả lời hay. Bạn có thể giải thích những gì bạn muốn nói là "Bạn sẽ cần cẩn thận rằng key_buffer và innodb_buffer_pool của bạn không tranh cãi"?
Neel

1
Tôi muốn được chứng minh là sai, nhưng logic có vẻ trái ngược với stackoverflow.com/a/6796566/5645769 ở đây.
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

7

Tôi không thể nói với bạn nếu đây là một thực tế phổ biến. Tôi có thể nói về kinh nghiệm của riêng tôi.

Tôi luôn sử dụng công cụ tốt nhất cho công việc, vì vậy tôi trộn động cơ mọi lúc. Hầu hết các dự án của tôi sử dụng MyISAM làm công cụ mặc định.

Khi tôi cần các tính năng đặc biệt chỉ có trên InnoDB, tôi sẽ sử dụng nó.

Khi một bảng chủ yếu là chỉ đọc, tôi chọn Công cụ lưu trữ trước khi tôi có thể nhấp nháy.

Biết rằng máy chủ có đủ bộ nhớ, tất cả dữ liệu tạm thời của tôi được lưu trữ trên các bảng Heap.

Tôi đã thấy trong quá khứ một số sự chậm chạp trộn MyISAM và InnoDB nhưng đây không phải là một vấn đề cụ thể của MySQL. Đây không phải là vấn đề thiết kế khi bạn chỉ sử dụng một động cơ. Trên thực tế, việc sử dụng sai công cụ gây ra sự chậm chạp hơn không thành vấn đề nếu đó chỉ là MyISAM, chỉ là InnoDB hoặc kết hợp cả hai. Thật khó để xác định một công thức để biết khi nào sự chậm lại sẽ xảy ra. Chỉ cần kiểm tra thực tế có thể nói nó với bạn.

Tất nhiên, bạn không thể duy trì tính toàn vẹn và nhất quán khi trộn InnoDB và MyISAM trên một truy vấn duy nhất.


công cụ lưu trữ không hỗ trợ lập chỉ mục, vậy tại sao bạn lưu trữ nó trong kho lưu trữ.
dùng4951

0

Tôi cố gắng tránh trộn các bảng MyISAM và InnoDB trong cùng một cơ sở dữ liệu, nhưng điều này là vì sự tỉnh táo hơn là lý do thực tế. Tuy nhiên, tôi thấy hữu ích khi có cơ sở dữ liệu với các bảng MyISAM để tìm kiếm toàn văn bản để tôi có thể chạy nó trên các trang web. Giữ nó trong một cơ sở dữ liệu riêng biệt với khóa ngoại cho mỗi mục nhập giúp mọi nhà phát triển khác làm việc trên DB dễ dàng nhìn thấy những gì đang diễn ra.


Làm thế nào bạn có thể có khóa ngoại khi bạn sử dụng MyISAM?
a_horse_with_no_name

Thuật ngữ sai, nhưng hoạt động như một khóa ngoại. Tôi lưu trữ số id của mục từ bảng InnoDB và sử dụng số đó để thực hiện tra cứu trang trên kết quả tìm kiếm.
Kenzo
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.