So sánh MongoDB và MySQL

MongoDB là một NoSQL database, MongoDB dẫn đầu bảng xếp hạng trong thời gian dài (là NoSQL database tốt nhất). MongoDB có rất nhiều người hâm mộ, rất nhiều trong số họ đã kinh ngạc với các tính năng ưa thích và tốc độ của nó. Và, câu hỏi ở đây được đặt ra không phải là quá stupid ở tất cả trường hợp, giống MongoDB đã promoted với tốc độ kinh ngạc và nêu ra cách MangoDB chạy nhanh và tốt hơn MySQL. Nhưng vẫn còn một điều, cuộc sống không hề đơn giản. ;D Hãy nhìn nhanh vào trong hoạt động nội bộ của các database engines này và trả lời câu hỏi.

MySQL xử lý các query như thế nào?
MySQL dựa trên khái niệm của một database khá cũ. Đó là lý do tại sao nó có một số vấn đề để nói. Khi bạn nghĩ về lịch sử của MySQL, nó có thể giải thích chi tiết lý do cách xây dựng như những gì bạn đã thấy. Qua đó có thể thấy rằng, MySQL cũng sử dụng các kỹ thuật hiện đại như sử dụng multiple threads để tăng hiệu suất, khi nhiều query cần được xử lý cùng một thời điểm, một số threads làm việc để xử lý các query song song với nhau. Nếu có một trường hợp high load (tải ở mức cao) với một lượng lớn query, MySQL xử lý cùng lúc một số query trong số chúng. Để tránh va chạm đối với các write query khác MySQL sử dụng một kỹ thuật gọi là locks để block các write query khác và bảo vệ các write query trên cùng một bản ghi(entry). Phụ thuộc vào storage engine bạn sử dụng, một cơ chế được gọi là row-locking có thể được sử dụng. Với row-locking, nếu một write query ở một row, cơ chế này sẽ block các query khác ghi dữ liệu vào cùng row đó cho đến khi quá trình ghi dữ liệu của query trước kết thúc. Cùng một thời điểm, các query khác vẫn có thể thay đổi, ghi dữ liệu ở các row khác trên cùng một table bằng một thread khác.

MongoDB xử lý các query như thế nào?
Khái niệm nội bộ của MongoDB hoàn toàn khác với MySQL. Để so sánh giữa chúng ở đây, tôi sẽ tập trung vào một điểm quan trọng, bỏ qua các điểm khác. Các query MongoDB không được xử lý song song cùng lúc. Tất cả các query tới MongoDB Server được đưa vào một hàng đợi, và server xử lý từng query một(tại thời điểm này, không có sự khác nhau nếu query được gửi tới cùng một collection [trong SQL là table], database hoặc không). MongoDB sử dụng một kỹ thuật gọi là instance-wide-locking. Điều này có nghĩa là, toàn bộ quá trình xử lý chỉ có thể chạy một query tại một thời điểm. Để loại bỏ một ít ‘nút cổ chai’, MongoDB đang chuyển sang database-wide-locks như đã đề cập trong release notes mới nhất.

Vậy điều này hàm ý gì? instance-wide-lock cho phép toàn bộ MongoDB Server để xử lý chỉ một write query ở cùng một thời điểm. database-wide-lock cho phép MongoDB Server xử lý chỉ một write query đối với mỗi database, nhưng có thể xử lý nhiều database cùng lúc. Điều này có thể khiến bạn cảm thấy thật khủng khiếp, nhưng có một điều bạn cần nhớ là các query trong MongoDB được xử lý nhanh hơn rất nhiều trong MySQL, và bạn sẽ thấy rằng nó không còn là vấn đề lớn. Tất nhiên, tất cả những điều nói ra ở đây chỉ có tác dụng nếu bạn thiết lập database một cách chính xác.

Làm thế nào so sánh MongoDB với MySQL?
Xét về hiệu xuất của một query đơn giản và duy nhất, MongoDB sẽ nhanh hơn rất nhiều MySQL. Trong kinh nghiệm của tôi, bạn có thể sẽ thấy được sự khác biệt trong các tình huống high load (tải ở mức cao) và một số trường hợp truy vấn phức tạp, hoặc đặc biệt. Trong MySQL, tất cả các quản trị dữ liệu đều hiểu tầm quan trọng của database indexes. So sánh với MangoDB có vẻ như hầu hết các quản trị viên không biết một cái gì tồn tại như indexes! Điều này bắt nguồn từ một thực tế, MongoDB là structureless database, tại sao tôi phải quan tâm indexes? Nhưng ở đây tôi muốn chỉ ra đây rằng việc sử dụng indexes thích hợp ít nhất cũng quan trọng như với các database engines khác.

ndexes trong MongoDB quan trọng như thế nào?
MongoDB sử dụng instance-wide-lock hoặc database-wide-lock đối với các write query. Nó có thể quan trọng hơn đối với việc thiết lập đúng đắn indexes trong MySQL. Để tôi cho bạn một ví dụ trong kinh nghiệm của tôi, và giả sử dụng chúng ta sử dụng instance-wide-locking.

Hình dung rằng bạn có một table với vài triệu bản ghi, mỗi bản ghi có một vài trường có dữ liệu dài và lớn trong cả MongoDB lẫn MySQL và không có định nghĩa indexes, nếu một truy vấn được thực hiện để update 100 bản ghi với điều kiện theo giá trị của một trường chỉ định. Điều gì sẽ xảy ra lúc này?

MySQL bắt đầu xử lý truy vấn trong một thread, và một tất nhiên là MySQL sẽ thực hiện ‘full table scan’ để tìm kiếm các bản ghi phù hợp với điều kiện trong vài triệu bản ghi. Và có thể truy vấn này sẽ mất chừng 20 phút để hoàn thành.

MongoDB sẽ xử lý cùng một truy vấn và chỉ mất chừng 5 phút. Nghe có vẻ rất tuyệt vời phải không? Trong thực tế, MongoDB Server đã scan toàn bộ collection (trong SQL là table) để tìm ra các bản ghi có liên quan. Như đã thảo luận lúc trước, trong 5 phút đó MangoDB sẽ block toàn bộ việc xử lý write query của cả server. Lúc này bạn còn thấy là 5 phút có phải là nhanh? Và MongoDB tốt hơn bởi vì nó nhanh hơn?

Thời gian thực thi một truy vấn đơn lẻ so với tác động tổng thể trên hệ thống là 2 việc khác nhau hoàn toàn. MySQL vẫn xử lý các write query khác gửi đến server, thậm chí trên cùng một database hoặc cùng một table. Trong khi Server đang bận rộn với ‘quey tốn thời gian’, tài nguyên được sử dụng và không được giải phóng cho các truy vấn khác, những truy vấn khác có thể chạy chậm hơn nhưng chúng vẫn được xử lý.

Trong 5 phút xử lý query trong MongoDB, instance-wide-lock được active sẽ dẫn đến tất cả các truy vấn khác phải xếp hàng đợi, không có ngoại lệ nào ở đây. Tất cả các truy vấn phải chờ cho việc xử lý xong, và các query trong hàng đợi được xử lý từng cái một. Điều này vẫn còn đúng khi kết nối cơ bản đã bị ngắt do timeout hoặc một vài lý do khác. Với thời gian thực hiện truy vấn dài, như ví dụ trên đối với một truy vấn, một đoạn mã PHP hay Python đã timeout và kết thúc. Đối với các ứng dụng web, trình duyệt có timeout ngắn và sẽ ngắt kết nối đến server. Như đã đề cập, truy vấn được xếp hàng đợi ngay cả khi kết nối đã closed, và các truy vấn vẫn tiếp tục được xử lý theo thứ tự.

Trên cả 2 hệ thống MongoDB và MySQL, nếu định nghĩa đúng indexes sẽ làm giảm thời gian truy vấn rất nhiều.

Kết luận
Ngay cả khi MongoDB thực hiện các truy vấn đơn giản và duy nhất nhanh hơn rất nhiều MySQL, nhưng không có nghĩa là nó sẽ nhanh ở mọi trường hợp, ngay cả một structure-less databases như thế này cũng cần có một vài cách tổ chức, định nghĩa các indexes là nhiệm vụ quan trọng, thiếu indexes có thể gây ra các tác động lớn ngay cả khi thời gian thực hiện truy vấn nhanh hơn nhiều MySQL.

MongoDB development road map cho thấy, vấn đề được mô tả là một vài thứ mà các nhà phát triển nhận thức được, chuyển từ instance-wide-locking sang database-wide-locking là một bước tiến lớn và đúng đắn. Hi vọng rằng các tính năng hữu ích sẽ sớm được ra mắt.

Tóm lại MongoDB

– Ưu điểm
o Tốc độ nhanh
o Lưu trữ và biểu diễn dữ liệu dưới dạng document.
o Khả năng mở rộng cao
o Tính đáp ứng cao
– Nhược điểm
o Không toàn vẹn dữ liệu
o Tốn tài nguyên hệ thống.

So sánh tải của MongoDB và MySQL: http://www.moredevs.ro/mysql-vs-mongodb-performance-benchmark/