2012-03-16 46 views
5

Tôi có một bảng với 17 triệu hàng. Tôi cần phải lấy 1 cột của bảng đó và chèn tất cả vào một bảng khác. Dưới đây là những gì tôi đã làm:mysql innodb vs myisam chèn

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001 

InnoDB thực hiện trong khoảng 3 phút và 45 giây

Tuy nhiên, MyISAM thực hiện chỉ trong vòng dưới 4 giây. Tại sao sự khác biệt?

Tôi thấy mọi người ca ngợi InnoDB nhưng thành thật mà nói tôi không thấy nó tốt hơn cho tôi như thế nào. Nó chậm hơn rất nhiều. Tôi hiểu rằng nó tuyệt vời cho tính toàn vẹn và không có điều gì, nhưng nhiều bảng của tôi sẽ không được cập nhật (chỉ đọc). Tôi có nên bận tâm với InnoDB không?

+0

tôi chỉ sử dụng InnoDB khi tôi đang làm việc với các bảng quan hệ. Nếu không, nếu bạn không có bất kỳ chìa khóa nước ngoài, MyISAM là những gì tôi thích! –

+0

chỉ để chỉ ra, có một chỉ số trên cả hai bảng. bảng "main" hiện đang là myisam. – nick

+0

ben, tôi muốn sử dụng các bảng quan hệ nhưng tôi sẽ xử lý hàng trăm triệu hàng - tôi cũng cần phải lập chỉ mục hàng chục cột, vì vậy tôi không biết phải đi theo hướng nào. tính toàn vẹn không phải là vấn đề. không phải cho phần này ít nhất. – nick

Trả lời

12

Sự khác biệt có nhiều khả năng là do cấu hình của innoDB, điều này cần tinh chỉnh nhiều hơn so với myISAM. Ý tưởng của innoDB là giữ cho hầu hết dữ liệu của bạn trong bộ nhớ, và xả/đọc vào đĩa chỉ khi bạn có một vài chu kỳ cpu dự phòng.

thậm chí bạn nên bận tâm với InnoDB là một câu hỏi thực sự hay. Nếu bạn định tiếp tục sử dụng MySQL, bạn nên có một số kinh nghiệm với InnoDB. Nhưng nếu bạn đang làm một công việc nhanh chóng và bẩn thỉu cho một cơ sở dữ liệu mà sẽ không thấy nhiều lưu lượng truy cập và không lo lắng về quy mô, thì sự dễ dàng của MyISAM có thể chỉ là một chiến thắng cho bạn. InnoDB có thể quá mức trong nhiều trường hợp mà ai đó chỉ muốn một cơ sở dữ liệu đơn giản.

nhưng nhiều người trong bàn của tôi sẽ không được cập nhật

Bạn vẫn có thể có được một thang máy hiệu suất từ ​​InnoDB nếu bạn đang làm 99% đọc. Nếu bạn cấu hình kích thước vùng đệm của bạn để giữ toàn bộ cơ sở dữ liệu trong bộ nhớ, InnoDB sẽ KHÔNG BAO GIỜ phải vào đĩa để lấy dữ liệu của bạn, ngay cả khi nó bỏ lỡ bộ nhớ truy vấn mysql. Trong MyISAM, có một cơ hội tốt để bạn đọc hàng từ đĩa, và bạn đang rời khỏi hệ điều hành để làm bộ nhớ đệm và tối ưu hóa cho bạn.

InnoDB-đệm-pool-kích thước

đoán đầu tiên của tôi là để kiểm tra innodb_buffer_pool_size mà tàu ra khỏi hộp thiết lập để 8M. Bạn nên có khoảng 80% tổng số bộ nhớ của mình. Một khi bạn đạt giới hạn đó, hiệu suất InnoDB sẽ giảm đáng kể vì nó cần phải tuôn một cái gì đó ra khỏi bộ đệm để nhường chỗ cho các dữ liệu mới, mà có thể tốn kém

autocommit = 0
Ngoài ra, hãy chắc chắn autocommit là tắt trong khi bạn tải bảng của bạn, hoặc xả sẽ xảy ra trên mỗi chèn. Bạn có thể bật lại sau khi đã hoàn tất và đó là cài đặt phía máy khách. rất an toàn.

Việc tải các bảng thường xảy ra khi
Hãy suy nghĩ xem bạn có thực sự muốn điều chỉnh cơ sở dữ liệu để chứa "chèn 17million hàng" hay không. Bạn có thường xuyên làm việc này không? MyISAM có thể nhanh hơn trong trường hợp này, nhưng khi bạn có 100 kết nối đồng thời tất cả đọc và sửa đổi bảng này cùng một lúc, bạn sẽ tìm thấy một innoDB được điều chỉnh tốt sẽ giành chiến thắng và MyISAM sẽ bị sặc trên ổ khóa bảng.

Làm thế nào MyISAM thấy hoạt động này
MyISAM sẽ rất giỏi trong việc này mà không cần bất kỳ điều chỉnh, bởi vì dưới lớp chăn, bạn chỉ cần gắn thêm mỗi hàng vào một tập tin (và cập nhật một index). Hệ điều hành và bộ nhớ đệm trên đĩa của bạn sẽ xử lý tất cả các vấn đề về hiệu suất đó.

Làm thế nào InnoDB thấy hoạt động này
InnoDB sẽ biết bảng cần một ghi, vì vậy nó ném hàng vào bộ đệm chèn. Bạn không có thời gian trước khi chèn tiếp theo, vì vậy innoDB không có thời gian để giải quyết bộ đệm, nó chạy ra khỏi phòng và bị buộc phải 'giữ' chèn trong khi nó ghi vào vùng đệm và cập nhật chỉ mục. Tiếp theo, vùng đệm của bạn đầy, và innoDB buộc phải 'giữ' chèn và xóa một số trang ra khỏi vùng đệm vào đĩa. Và bạn tiếp tục ném vào nó như điên. Lưu ý rằng khi bạn điều chỉnh InnoDB để cung cấp cho bạn một dấu nhắc MySQL> rất nhanh sau khi bạn làm điều này, InnoDB vẫn sẽ xáo trộn bên dưới vỏ để bắt kịp trong thời gian rảnh rỗi, nhưng sẽ sẵn sàng thực hiện giao dịch mới cho bạn.

PHẢI ĐỌC:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html (nhìn thấy số lượng lớn các mẹo dữ liệu tải)

+0

Xin vui lòng, bất kỳ chuyên gia hiệu suất MySQL (đặc biệt là từ Percona) được chào đón để sửa chữa cho tôi nếu tôi đã đi sai hoặc để lại bất cứ điều gì. Tôi sẽ cập nhật câu trả lời. – FlipMcF

+0

Một chút không chính xác với "nhấn một giới hạn trên innodb-buffer-pool-size" Flushing thực sự liên quan đến việc nhấn "innodb_max_dirty_pages_pct". Nhưng đó là tách tóc cho câu hỏi này, tôi đoán vậy. – FlipMcF

+0

Ngoài ra, đọc tốt cho bạn: http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/ – FlipMcF

1

Bạn đang nói đúng một số mở rộng. InnoDB chậm hơn MyISAM nhưng trong trường hợp nào? Mọi thứ không được thực hiện để đáp ứng các yêu cầu của mọi người. INNODB là một cơ sở dữ liệu giao dịch trong khi MyISAM thì không. Do đó để làm cho nó tuân thủ ACID và giao dịch nhận biết công cụ lưu trữ, chúng tôi phải trả chi phí của nó về thời gian phản ứng.

Hơn nữa, InnoDB chạy nhanh hơn nếu được điều chỉnh đúng bằng cách sử dụng tệp my.ini hoặc tệp cấu hình khác.

Vào cuối tôi có thể hiểu được lý do sau đây lý do tại sao mọi người đang ca ngợi InnoDB:

  1. Nó phù ACID và động cơ giao dịch được hỗ trợ
  2. Nó mất hàng cấp khóa khi làm việc trên một bảng trong khi MyISAM ổ khóa lấy bảng cấp
  3. InnoDB là rất cao thể điều hướng cho máy đa lõi/đa quá trình để cải thiện đồng thời

cuối cùng nhưng không phải là bình luận nhất từ ​​tôi bên; bất cứ điều gì có thể đáp ứng nhu cầu "của mọi người" vì vậy nó chỉ phụ thuộc vào kịch bản nào bạn so sánh cả hai động cơ.

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