Mysql: Chèn hiệu suất INNODB so với MYISAM


9

Tôi đang chèn vào một bảng nhỏ đơn giản với 5 thuộc tính và 1000 hàng.

Tôi quan sát thấy khi động cơ là INNODB, mỗi lần chèn mất 0,03 - 0,05 giây. Tôi đã thay đổi động cơ thành MYISAM, sau đó chèn nhanh hơn. nó đang lấy 0,001 - 0,003.

Vấn đề là gì innodb_flush_log_trx_commit = 1 theo mặc định. Tôi đã được thiết lập như nó là. Đây là thiết lập innodb của tôi.

innodb_log_buffer_size : 1MB
innodb_log_file_size   : 5MB
innodb_buffer_pool_size: 8MB
innodb_flush_log_trx_commit = 1

mysql> desc table ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | YES  |     | NULL    |       |
| count | int(10) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

BIẾN

mysql> show variables like 'innodb%' ;
+-----------------------------------------+------------------------+
| Variable_name                           | Value                  |
+-----------------------------------------+------------------------+
| innodb_adaptive_hash_index              | ON                     |
| innodb_additional_mem_pool_size         | 1048576                |
| innodb_autoextend_increment             | 8                      |
| innodb_autoinc_lock_mode                | 1                      |
| innodb_buffer_pool_size                 | 8388608                |
| innodb_checksums                        | ON                     |
| innodb_commit_concurrency               | 0                      |
| innodb_concurrency_tickets              | 500                    |
| innodb_data_file_path                   | ibdata1:10M:autoextend |
| innodb_data_home_dir                    |                        |
| innodb_doublewrite                      | ON                     |
| innodb_fast_shutdown                    | 1                      |
| innodb_file_io_threads                  | 4                      |
| innodb_file_per_table                   | OFF                    |
| innodb_flush_log_at_trx_commit          | 1                      |
| innodb_flush_method                     |                        |
| innodb_force_recovery                   | 0                      |
| innodb_lock_wait_timeout                | 50                     |
| innodb_locks_unsafe_for_binlog          | OFF                    |
| innodb_log_buffer_size                  | 2097152                |
| innodb_log_file_size                    | 5242880                |
| innodb_log_files_in_group               | 2                      |
| innodb_log_group_home_dir               | ./                     |
| innodb_max_dirty_pages_pct              | 90                     |
| innodb_max_purge_lag                    | 0                      |
| innodb_mirrored_log_groups              | 1                      |
| innodb_open_files                       | 300                    |
| innodb_rollback_on_timeout              | OFF                    |
| innodb_stats_method                     | nulls_equal            |
| innodb_stats_on_metadata                | ON                     |
| innodb_support_xa                       | ON                     |
| innodb_sync_spin_loops                  | 20                     |
| innodb_table_locks                      | ON                     |
| innodb_thread_concurrency               | 8                      |
| innodb_thread_sleep_delay               | 10000                  |
| innodb_use_legacy_cardinality_algorithm | ON                     |

+ ----------------------------------------- + ------- ----------------- + 36 hàng trong bộ (0,00 giây)

Tôi không thể tìm ra điều gì đã xảy ra với điều này. Cảm ơn trước. Trân trọng, UDAY


Bạn có thể thêm định nghĩa của bảng và tất cả các innodn_xxxcài đặt của máy chủ MySQL của bạn không?
ypercubeᵀᴹ

Ngoài ra kiểm tra bài viết blog này để bắt đầu với: Khái niệm cơ bản tối ưu hóa hiệu suất của Innodb . Cài đặt MySQL mặc định thường không được tối ưu hóa cho việc sử dụng InnoDB. Kích thước nhóm bộ đệm của bạn quá thấp, để bắt đầu.
ypercubeᵀᴹ

xin vui lòng xem thông tin cập nhật.
Uday

Tôi sẽ bắt đầu với innodb_buffer_pool_size. 8MB là quá thấp. Nó thực sự phụ thuộc vào tổng RAM máy chủ của bạn và những dịch vụ / ứng dụng nào bạn chạy trên máy chủ nhưng bạn có thể đặt nó ở nhiều GB, nếu tổng bộ nhớ của bạn đủ cao.
ypercubeᵀᴹ

Trên thực tế tôi đã thử với 64 MB thậm chí kết quả tương tự đã được quan sát. Tôi sẽ kiểm tra điều này tăng liên tiếp này.
Uday

Câu trả lời:


21

Lý do rất đơn giản. Khi bạn chèn một hàng vào MyISAM, nó sẽ đặt nó vào bộ nhớ của máy chủ và hy vọng rằng máy chủ sẽ chuyển nó vào đĩa vào một thời điểm nào đó trong tương lai. Chúc may mắn nếu máy chủ gặp sự cố.

Khi bạn chèn một hàng vào InnoDB, nó sẽ đồng bộ hóa giao dịch lâu dài vào đĩa và điều đó đòi hỏi nó phải chờ đĩa quay. Làm toán trên hệ thống của bạn và xem mất bao lâu.

Bạn có thể cải thiện điều này bằng cách thư giãn innodb_flush_log_at_trx_commit hoặc bằng cách sắp xếp các hàng trong một giao dịch thay vì thực hiện một giao dịch mỗi hàng.

Tôi đặc biệt khuyên bạn nên đọc Phiên bản thứ 3 hiệu suất cao của MySQL (Tôi là tác giả).


Đúng vậy đây là sự thật. Nhưng khi tôi có innodb_flush_log_at_trx_commit = 1, tôi đã quan sát 40% trên máy chủ. nhiều hơn thay đổi innodb_flush_method thành O_DIRECT hoặc O_DSYNC đã cải thiện hiệu suất gấp 5 lần. bạn có thể nói bất cứ điều gì về 40% IO này với innodb_flush_log_at_trx_commit = 1 ..?
Uday

Như cuốn sách của Nam tước cũng phác thảo. Ngoài ra còn có thêm lợi ích của việc chèn đồng thời cho các bảng MyISAM. Trên máy chủ sản xuất của chúng tôi, chúng tôi thấy các khoảng chèn khoảng 0,004 giây cho các bảng không có khoảng trống, do đó chèn đồng thời sẽ hoạt động. Tuy nhiên, trên các bảng của chúng tôi có các khoảng trống, trong đó không thể chèn đồng thời, tốc độ chèn giảm hơn x10 lần. Chúng tôi không có bất kỳ bảng innodb nào nên tôi không thể so sánh với chúng.
Haluk

2

InnoDB sẽ chậm hơn một chút vì nó tuân thủ ACID, có MVCC và thực hiện những việc hữu ích như thực sự kiểm tra khóa ngoại, v.v.

Ví dụ, whitepaper của Oracle cho MyISAM vs InnoDB mà họ thực sự nói

Các điểm chuẩn này được chạy với các ràng buộc ACID thoải mái để cung cấp phân tích tương đương hơn với MyISAM ...

Khác, từ " Bạn có nên chuyển từ MyISAM sang Innodb không?" (đậm của tôi)

Hiệu suất

... trong khi về mặt hạn chế, chúng ta thấy kích thước bảng lớn đáng kể (đặc biệt là nếu kích thước dữ liệu gần với kích thước bộ nhớ), thường ghi chậm hơn, xử lý blob chậm hơn, các vấn đề tương tranh, xử lý các vấn đề với số lượng bảng rất lớn, tải dữ liệu chậm và THAY ĐỔI BẢNG và những người khác. Một số lớn khác là COUNT (*) không có mệnh đề where thường là nút chặn hiển thị cho chúng di chuyển cho đến khi nó được xử lý xung quanh.

Bạn không thể so sánh tốc độ viết like-for-like ...


Đúng. Chúng tôi không thể so sánh. Nhưng tốc độ ghi đơn này chèn bình thường là mất 0,3 - 0,5 là không thể chấp nhận được. Điều này thật kinh khủng. Nó không phải là một cái bàn lớn hay một cái phức tạp. Nó thậm chí không phải là máy chủ trực tiếp. vậy thì tại sao màn trình diễn này ...?
Uday

Tại sao cài đặt InnoDB của bạn quá thấp cho người mới bắt đầu?
gbn

Tôi đã cài đặt mysql với apt-get trên địa phương của tôi. chúng là các khu định cư mặc định. Nhưng tôi không thể chấp nhận những hiệu suất viết. Bạn có cảm thấy bất cứ điều gì cần phải được cải thiện ..?
Uday

1

Khi bạn đang sử dụng InnoDB, bạn có khóa cấp hàng và trong MyISAM bạn có khóa cấp bảng. Điều này không có ý nghĩa trong điểm chuẩn chỉ có 1 kết nối với DB. Nhưng nếu bạn chạy 100 tập lệnh mô phỏng để chèn, thì sự khác biệt sẽ rõ ràng.

Ngoài ra, hãy nhớ rằng InnoDB lưu trữ dữ liệu theo thứ tự theo thứ tự của khóa chính. Nếu nó không tự động và các phần chèn tạo ra các giá trị ngẫu nhiên nào đó cho khóa chính, bạn sẽ đạt giới hạn I / O vì ghi ngẫu nhiên. Điều này có thể nhìn thấy trong một điểm chuẩn khi kích thước bảng lớn hơn vùng đệm.


Đến bữa tiệc muộn, vâng, nhưng con bò thần thánh đã làm đoạn thứ hai đó giúp ích rất nhiều. Hơn nữa, đó là nơi duy nhất tôi thấy được đề cập ngay cả sau khi xem hơn một chục bài viết SO và DBA-SO về việc tăng tốc độ chèn mysql.
Jeutnarg

0

MyISAMtrong hầu hết các trường hợp sẽ nhanh hơn so với InnoDBviệc chạy loại công việc. Chọn, cập nhật và chèn đều rất nhanh trong các trường hợp thông thường. InnoDBnghiêm ngặt hơn trong tính toàn vẹn dữ liệu trong khi MyISAMlỏng lẻo. MyISAMcó chỉ mục tìm kiếm toàn văn trong khi InnoDB thì không.

Ưu điểm của MyISAM:

  • Đơn giản hơn để thiết kế và tạo, do đó tốt hơn cho người mới bắt đầu. Không phải lo lắng về các mối quan hệ nước ngoài giữa các bảng.

  • Nhanh hơn so với InnoDB về tổng thể do cấu trúc đơn giản hơn do đó chi phí tài nguyên máy chủ ít hơn nhiều. Lập chỉ mục toàn văn.

  • Đặc biệt tốt cho các bảng đọc chuyên sâu (chọn).

MySIAMChậm hơn so InnoDBvới các bảng thường xuyên được chèn vào hoặc cập nhật, vì toàn bộ bảng bị khóa đối với mọi thao tác chèn hoặc cập nhật.

Ưu điểm của Innodb:

  • InnoDB nên được sử dụng khi tính toàn vẹn dữ liệu được ưu tiên bởi vì nó vốn đã chăm sóc chúng bằng sự trợ giúp của các ràng buộc và giao dịch.
  • Nhanh hơn trong các bảng chuyên sâu viết (chèn, cập nhật) vì nó sử dụng khóa cấp hàng và chỉ giữ các thay đổi cho cùng một hàng được chèn hoặc cập nhật.

Conslusion: Việc so sánh khá đơn giản. InnoDB phù hợp hơn cho các tình huống quan trọng về dữ liệu yêu cầu chèn và cập nhật thường xuyên. MyISAM, mặt khác, hoạt động tốt hơn với các ứng dụng không phụ thuộc hoàn toàn vào tính toàn vẹn dữ liệu và chủ yếu chỉ chọn và hiển thị dữ liệu.

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmark-part-1/


Hei ... tôi biết những thứ khái niệm này. trường hợp của tôi rất đơn giản chèn bảng đơn giản với hiệu suất kém hơn do innodb. cho tôi biết nếu điều sm có thể thay đổi điều này. Trân trọng -uday
Uday

"MyISAM nhanh hơn InnoDB trên toàn bộ". Điều đó gây tranh cãi, ít nhất. Có những bài báo rằng FK có thể cải thiện hiệu suất trong một số trường hợp nhất định. Và ngay cả khi đó là sự thật, một sự gia tăng hiệu suất nhỏ trong một số trường hợp không phải là lý do chính đáng để mất tính toàn vẹn.
ypercubeᵀᴹ

1
@uday: Trên thực tế MyISAM sẽ chậm hơn nếu khối lượng công việc chuyển sang nhiều lần đọc ghi đồng thời vì khóa mà MyISAM sẽ áp đặt.
a_horse_with_no_name

@uday đặt các giá trị này và thử lại? innodb_log_buffer_size = 16M cho innodb_buffer_pool_size Bạn có thể đặt giá trị này thành 70-80% bộ nhớ khả dụng cho các cài đặt chỉ dành cho Innodb cho innodb_flush_log_trx_commit = 2 - ghi vào bộ nhớ cache của OS. Để đĩa mỗi giây.
Mahesh Patil

1
thay đổi innodb_flush_method từ mặc định thành O_DSYNC hoặc O_DIRECT đã cải thiện hiệu suất tốt hơn 5 lần.
Uday

0

Có sự khác biệt tinh tế trong INDEXing giữa các động cơ. Cho đến khi bạn kiểm tra điều này, bạn có thể có những trường hợp bí ẩn trong đó một động cơ nhanh hơn động cơ kia - một trong hai hướng. Ngay cả sau khi kiểm tra các chỉ mục, sẽ có trường hợp hoặc là nhanh hơn so với khác. Điều này bao gồm tất cả các trường hợp tôi biết: http://mysql.rjweb.org/doc.php/myisam2innodb

An, như những người khác đã nói, làm điều chỉnh cho động cơ. Xem http://mysql.rjweb.org/doc.php/memory

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.