Cơ sở dữ liệu Drupal innodb hay MyISAM?


10

Tôi có một trang web Drupal và tôi đang gặp vấn đề về hiệu suất. Tôi đã tìm thấy Làm cách nào để chuyển đổi cơ sở dữ liệu từ MyISAM sang InnoDB? chỉ ra rằng hiệu suất có thể cải thiện bằng cách chuyển đổi.

Làm cách nào để biết cơ sở dữ liệu MySQL của tôi là InnoDB hay MyISAM?


1
Loại bảng không được gắn với danh mục. Bạn có thể có một danh mục với sự kết hợp của các bảng MyISAM và InnoDB trong đó.
mpdon Arena

2
Mặc dù có những lợi ích cho việc tối ưu hóa ở mức đó, tôi rất nghi ngờ việc thay đổi các loại bảng sẽ khắc phục các vấn đề về hiệu suất của bạn. Sự khác biệt không phải là lớn.
Letharion

1
@Chris J. Lee, đúng vậy. Trộn các loại bảng có thể được sử dụng vì lý do hiệu suất hoặc để khai thác các tính năng chỉ có sẵn cho một loại bảng cụ thể (ví dụ: tìm kiếm FULLTEXT với các bảng MyISAM). Nó cũng có thể xảy ra một cách tình cờ nếu bạn thay đổi mặc định mysqld và tạo thêm bảng trong danh mục :)
mpdonadio

2
Letharion: đó chỉ là không chính xác. Các loại bảng và cách mysql được cấu hình cho chúng có ảnh hưởng rất lớn đến hiệu suất!
Walter Heck

2
@Letharion: Trên thực tế, bỏ qua các cải tiến về kiến ​​trúc, tăng hiệu suất rất lớn trong trường hợp những thứ như đồng thời với các CHỌN và CẬP NHẬT hỗn hợp, một bản cập nhật sẽ khóa một bảng trong MyISAM, nhưng chỉ một hàng trong InnoDB có nghĩa là tăng hiệu suất rất lớn có thể được nhìn thấy không có gì hơn là thay đổi động cơ của bảng. Bây giờ, nếu bạn đang thực hiện một truy vấn ngớ ngẩn, thì bạn đang thực hiện một truy vấn ngớ ngẩn và thay đổi các loại bảng sẽ không có ích. Nhưng để loại bỏ các động cơ thay đổi ra khỏi tay là không chính xác.
BMDan

Câu trả lời:


8

Bạn có thể chạy một truy vấn tùy chỉnh:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

để liệt kê tất cả các bảng trong cơ sở dữ liệu của bạn và công cụ được sử dụng cho mỗi bảng.

Ngoài ra, bạn có thể đăng nhập vào cơ sở dữ liệu của mình bằng phpMyAdmin và chọn cơ sở dữ liệu của mình ... bạn sẽ thấy công cụ trong Typecột trong danh sách các bảng.

Cá nhân tôi muốn giới thiệu Navicat cho MySQL , đó là một GUI MySQL rất đẹp và giúp cho việc tìm hiểu những thứ như thế này trở nên rất dễ dàng.

Nguồn: http://www.electrictoolbox.com/mysql-table-st Storage-engine /


Công cụ quản trị viên MySQL cũ cũng hoạt động tốt cho những thứ như thế này. Nếu bạn tìm kiếm trên trang web MySQL, bạn vẫn có thể tìm thấy trình cài đặt.
mpdon Arena

@MPD Wow vẫn còn đó chứ? Phải tải xuống ngay cả khi chỉ vì một chút hoài niệm :)
Clive

Quản trị viên và Trình duyệt truy vấn chính thức không được hỗ trợ và không được hỗ trợ, nhưng bạn vẫn có thể tải xuống. Tôi ghét Workbench, và vẫn sử dụng chúng.
mpdon Arena

Để xem đầu ra tương tự như những gì bạn đã thấy trong phpMyAdmin tại dòng lệnh, hãy sử dụng SHOW TABLE STATUS. Để có được số đếm đơn giản có bao nhiêu bảng trong mỗi loại động cơ, nó SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan

7

Chỉ cần thử mọi thứ để có được một trang web nhanh hơn cũng giống như những chiếc xe thay đổi một cách mù quáng và hy vọng bạn sẽ nhanh hơn một lần tiếp theo.

Trước tiên, hãy thử các loại trái cây treo thấp, nếu nó không có ích, hãy thử tìm ra nút cổ chai thực sự.

  1. Bạn đã bật các cơ chế tích hợp sẵn: bộ đệm ẩn trang (chỉ hiệu quả đối với người dùng ẩn danh), phân chia CSS và JS?
  2. Nếu máy chủ của bạn cung cấp bộ đệm opcode như APC, hãy bật nó lên.
  3. Thiết lập địa phương Drupal của bạn, bao gồm DB đầy đủ.
  4. Hãy chắc chắn rằng bạn có XDebug đang chạy.
  5. Bắt đầu thực hiện hồ sơ hiệu suất thực sự. Bằng cách này bạn có thể xác định phần nào của trang web của bạn tiêu tốn rất nhiều thời gian. Trang web của bạn càng chậm thì càng dễ tìm thấy mã / thành phần có tội.

Thông thường, đó chỉ là một truy vấn DB chậm cần một chỉ mục hoặc một mô-đun thực hiện mọi thứ một cách chậm chạp.

Tôi cũng phát hiện ra sự khác biệt lớn giữa các chủ nhà. Nếu bạn cài đặt một drupal mới ra khỏi hộp, hiệu suất có ổn không? Nếu không, đã đến lúc tìm kiếm một con gà trống khác.


6

Kinh nghiệm tốt nhất của tôi là quyết định trên cơ sở mỗi bảng. InnoDB là tốt, bởi vì nó có thể tránh bị khóa bảng (không có quá trình nào khác có thể đọc từ bảng trong khi một tiến trình ghi), nhưng nó thực hiện khủng khiếp với COUNT () thường được sử dụng cho các truy vấn máy nhắn tin.

(Chỉnh sửa: vui lòng xem bình luận của Clives bên dưới)

Ngoài ra còn có ý nghĩa đối với thiết lập MySQL của bạn, tùy thuộc vào DB bạn đang sử dụng. Nếu bạn có quyền truy cập vào máy chủ, mysqltuner sẽ là bước đầu tiên của bạn, để kiểm tra cấu hình:

https://github.com/rackerhacker/MySQLTuner-perl#readme


2
1 Tôi không biết InnoDB là chậm đối với COUNTcác truy vấn, theo bài viết này bằng cách quản lý hiệu suất cao Nhóm cựu cho MySQL mặc dù nó chỉ thực sự ảnh hưởng đến một truy vấn có chứa COUNT(*) mà không cần một WHEREkhoản.
Clive

3
Lý do là MyISAM duy trì giá trị trên mỗi bảng cho số lượng hàng trong bảng, điều đó có nghĩa là một đơn giản SELECT COUNT(*) FROM tablecó thể trả về ngay lập tức với giá trị đó. InnoDB thì không, vì vậy nó phải quét toàn bộ chỉ mục khóa chính. Điều đó nói rằng, trong khi Drupal làm rất nhiều SELECT COUNT(*), tôi chỉ có thể nghĩ về một nơi trong toàn bộ mã mà không có một WHEREmệnh đề. Do đó, không sử dụng MyISAM vì lo lắng cho edgecase đặc biệt này. InnoDB với nhóm bộ đệm kích thước khá sẽ nhanh hơn cho tất cả các truy vấn trong thế giới thực.
BMDan

5

FWIW trang web Drupal 6.x nút gần 20K của chúng tôi đã gặp phải một số vấn đề về hiệu suất và tôi đã chọn chuyển tất cả các bảng sang InnoDB. Thật dễ dàng và cách tôi xử lý là sử dụng mysqldump để chuyển tất cả nội dung vào tệp sql, sử dụng trình soạn thảo (sed) để thay thế tất cả các lần xuất hiện của MyISAM sang InnoDB sau đó tải lại cơ sở dữ liệu từ tệp đó. Một trong những nhược điểm là bạn không thể khôi phục dung lượng từ cơ sở dữ liệu InnoDB (IIRC) nhưng miễn là bạn giữ các bảng trùng lặp của mình trong một DB riêng biệt, bạn sẽ không gặp vấn đề gì. Ồ, và chúng tôi đã thấy một sự gia tăng hiệu suất đáng kể. Và bởi vì chúng tôi có bốn phiên bản Drupal, số lượng tệp bảng tuyệt đối đã bị loại khỏi hệ thống tệp (vâng, chúng được chứa trong chính tệp InnoDB). Đây là giá trị 0,02 đô la của tôi.


2
Có một không gian bảng InnoDB duy nhất có thể giúp bạn tiết kiệm các nút, nhưng (như bạn tự đề cập) với chi phí không gian đĩa. Ngay cả khi bạn xóa nhiều dữ liệu, bạn sẽ không thể lấy lại dung lượng đĩa đó. Điều này cũng dẫn đến các tệp sao lưu lớn không cần thiết và không thể khôi phục các bảng đơn lẻ. Đó là lý do tại sao tôi thích sử dụng innodb_file_per_tabletùy chọn này.
geewiz

1
Ngoài ra, bạn có thể chuyển đổi bảng tại chỗ : for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Thêm tùy chọn thích hợp ( -uroot -psomepassví dụ) vào hai mysqls nếu cần.
BMDan

5

Chỉ cần một cái đầu lên. Nếu trên Drupal 6, bạn có thể cài đặt mô-đun DBTuner ; nó có thể dễ dàng di chuyển các bảng của bạn từ MyISAM sang InnoDB. Vì vậy, có, có một mô-đun cho điều đó!

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.