Chúng ta có thể lưu trữ json trong mongodb không?

MySQL đã thêm khả năng lưu trữ tài liệu JSON ở định dạng doc-store với MySQL phiên bản 5. 7 (ngày khả dụng chung – 21 tháng 10 năm 2015). Mặc dù bản phát hành đầu tiên của MySQL về tính năng lưu trữ tài liệu của họ có một số hạn chế, nhưng MySQL đã thực hiện một số cải tiến thực sự tốt trong phiên bản 8 của họ. 0 và gần đây hơn, trong 8. 0. 19 phát hành

Tôi tình cờ thấy một bài báo được viết bởi Erik Andersson và Zacharias Berggren có tiêu đề “So sánh giữa MongoDB và MySQL Document Store Xem xét hiệu suất“. Tôi nghĩ rằng bài báo được viết cho một dự án đại học (và nó có thể là luận án cấp cao của họ khi họ theo học chương trình cử nhân khoa học máy tính). Trong bài báo, họ đã so sánh MongoDB 3. 4. 4 so với MySQL phiên bản 5. 7. 12, là bản phát hành sớm của MySQL phiên bản 5. 7. Và, không có gì ngạc nhiên khi kho lưu trữ tài liệu MongoDB nhanh hơn nhiều so với MySQL

Tuy nhiên, với tất cả các thay đổi mới và cải tiến đối với kho lưu trữ tài liệu của MySQL trong bản phát hành mới nhất (phiên bản 8. 0. 19), tôi đã thử tạo lại các thử nghiệm của họ để xem liệu MySQL có được cải thiện kể từ phiên bản 5 hay không. 7. 12. Và, cả hai sản phẩm lẽ ra đã được cải thiện kể từ lần thử nghiệm ban đầu vào năm 2017

từ chối trách nhiệm

Tôi là kỹ sư giải pháp tại MySQL và tôi không phải là người dùng MongoDB. Có thể có nhiều cách để định cấu hình cả hai cơ sở dữ liệu nhanh hơn, nhưng tôi đã thực hiện các thử nghiệm này mà không sửa đổi bất kỳ biến mặc định nào có thể ảnh hưởng đến hiệu suất. Ngoại lệ duy nhất là đối với MySQL, tôi đã thực hiện một thử nghiệm riêng với nhật ký nhị phân bị vô hiệu hóa (tôi sẽ giải thích điều này sau trong bài viết)

Có hai biến không liên quan đến hiệu suất mà tôi phải thay đổi. Đối với MySQL, tôi phải đặt max_join_size=11000000 khi chạy các truy vấn cho cơ sở dữ liệu lớn nhất. Đối với MongoDB, tôi phải đặt DBQuery. shellBatchSize=1000 hoặc MongoDB sẽ chỉ trả về 20 hàng cùng một lúc trong cửa sổ đầu cuối

Thiết bị

Tôi đã chạy thử nghiệm trên máy chủ của riêng mình, sau đó trên Máy ảo trong Cơ sở hạ tầng đám mây của Oracle (OCI). Phần cứng máy chủ của tôi như sau

  • Bộ xử lý Intel Core i7-8700K thế hệ thứ 8 (6 nhân / 12 luồng)
  • 32GB DDR4 DRAM 2666MHz
  • SSD PC 500GB SATA III 6 Gb/s M. 2
  • Bo mạch chủ Gigabyte Z370 AORUS
  • Hệ điều hành Mac 10. 13. 6

Đối với OCI, tôi đã sử dụng VM. Tiêu chuẩn. B1. 1 hình dạng, bao gồm những điều sau đây

  • OCPU đơn – 2. Intel® Xeon® E5-2699 v4 2 GHz
  • 11. Bộ nhớ 8GB
  • Khối lượng khối từ xa 100 GB
Cài đặt

GHI CHÚ. Tôi sẽ không đi vào chi tiết cách cài đặt MongoDB, NodeJS hoặc MySQL, nhưng tôi sẽ cung cấp các liên kết

Tôi đã bắt đầu bằng cách cài đặt MongoDB qua yum. Theo hướng dẫn cài đặt, tôi đã tạo tệp repo MongoDB (/etc/yum. repo. d/mongodb-org-4. 2. repo), đã chỉnh sửa tệp repo và thêm vào như sau

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

Ghi chú. gpgcheck là trình bảo vệ quyền riêng tư của GNU, giúp xác minh rằng bạn đang cài đặt đúng gói từ MongoDB chứ không phải từ bên thứ ba

Sau đó tôi đã sử dụng lệnh này để cài đặt MongoDB qua yum

sudo yum install -y mongodb-org

Tôi cũng đã phải cài đặt NodeJS. Để cài đặt, tôi đã sử dụng các lệnh sau

curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install nodejs

Tôi đã tải RPM mới nhất (phiên bản 8. 0. 19) Bản phát hành cộng đồng MySQL và cài đặt nó qua yum

sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm -y
sudo yum install mysql-community-server -y

Tôi đã bắt đầu cả MongoDB và MySQL

sudo service mongod start
sudo service mysqld start

Và tôi đã xác nhận tình trạng của từng

sudo service mongod status
sudo service mysqld status

Bây giờ tôi đã cài đặt MongoDB và MySQL, tôi cần một số dữ liệu

Dữ liệu

Tôi đã tìm thấy một số dữ liệu JSON cơ bản trên dữ liệu. trang web gov – một trang web tuyệt vời để tìm kiếm dữ liệu JSON chung. Trong trường hợp này, tôi cần một tập dữ liệu lớn, vì vậy tôi đã tìm thấy một số dữ liệu JSON bao gồm danh sách các doanh nghiệp ở bang Washington (Hoa Kỳ). Tệp tôi đã tải xuống chứa 2. 6 triệu bản ghi. Các bản ghi JSON chứa dữ liệu này

{
"Ubi": "1234567890",
"Title": "GOVERNOR",
"FirstName": "CHRISTOPHER",
"MiddleName": "WALKEN",
"LastName": "KRAMER",
"Address": "324 SMITHY DR",
"City": "NOWHERE",
"State": "XA",
"Zip": "05252"
}

Tôi biết ví dụ này không phải là một tài liệu lớn nhưng đó là tập dữ liệu duy nhất mà tôi có thể tìm thấy với hàng triệu bản ghi

Quản lý dữ liệu

tôi lấy 2 cái. 6 triệu (2.600.000) bản ghi và chia tệp đơn gốc thành ba tệp (sử dụng lệnh tách). Điều này tạo ra hai tệp chứa một triệu bản ghi và tệp cuối cùng chứa 600.000 bản ghi. Tôi đã loại bỏ tập tin cuối cùng

Tôi đã sử dụng một trong các tệp chứa một triệu bản ghi và chia thành mười tệp chứa 100.000 bản ghi. Sau đó, tôi lấy một trong các tệp có 100.000 bản ghi và chia nó thành mười tệp với 10.000 bản ghi mỗi tệp. Tôi cũng làm như vậy với tệp bản ghi 10.000, chia nó thành mười tệp bản ghi 1.000

Chúng ta có thể lưu trữ json trong mongodb không?

Tôi đã sử dụng cùng một tệp JSON cho cả MongoDB và MySQL

Ghi chú. Tôi sẽ không chia sẻ dữ liệu tôi đã sử dụng. Mặc dù dữ liệu là dữ liệu công khai, nhưng nó chứa thông tin cá nhân và với tư cách là nhân viên của Oracle, nó có thể vi phạm chính sách quyền riêng tư của họ

cơ sở dữ liệu

Tôi đã tạo cùng một cơ sở dữ liệu để sử dụng trên cả hai. Quy ước đặt tên như sau

  • db_json_test10k = 10 x 1 nghìn bản ghi được nhập – tổng cộng 10 nghìn bản ghi
  • db_json_test100k = 10 x 10 nghìn bản ghi đã nhập – tổng cộng 100 nghìn bản ghi
  • db_json_test1000k = 10 x 100 nghìn bản ghi đã nhập – tổng cộng 1.000 nghìn bản ghi
  • db_json_test10000k = 10 x 1000 nghìn bản ghi đã nhập – tổng cộng 10.000 nghìn bản ghi

Khi nhập tài liệu JSON, cơ sở dữ liệu được tạo tự động trong MongoDB. Với MySQL, bạn phải tạo thủ công

create database db_json_test10k;
create database db_json_test100k;
create database db_json_test1000k;
create database db_json_test10000k;

Các tài liệu bên trong cơ sở dữ liệu có thể được tạo tự động bởi cả MongoDB và MySQL

Các bài kiểm tra

Tôi đã không thêm bất kỳ biến cấu hình nào cho cả hai cơ sở dữ liệu – ngoại trừ những gì tôi đặt trong tệp repo MongoDB – vì vậy các biến mặc định được sử dụng cho mỗi cơ sở dữ liệu. Đối với MySQL, nhật ký nhị phân được bật theo mặc định, vì vậy tôi đã chạy thử nghiệm với bật và tắt nhật ký nhị phân. Đối với MySQL, nhật ký nhị phân chứa tất cả các giao dịch có thể thay đổi dữ liệu. Nói cách khác, tất cả các giao dịch chèn, cập nhật và xóa được ghi vào nhật ký (nhị phân) trên đĩa. Rõ ràng, việc chạy thử nghiệm mà không bật nhật ký nhị phân sẽ nhanh hơn trong MySQL

Mỗi bài kiểm tra bao gồm những điều sau đây

  • Bỏ tất cả cơ sở dữ liệu (nếu cần)
  • Tạo cơ sở dữ liệu MySQL
  • Nhập các bản ghi 1k, 10k, 100k và 1.000k (10 lần mỗi lần với dữ liệu duy nhất trong mỗi lần nhập)
  • Tạo chỉ mục – được thực hiện một lần mỗi vòng trên mỗi cơ sở dữ liệu
  • Thực hiện 100 truy vấn tìm kiếm x 10 lần khác nhau
  • Thực hiện 100 truy vấn cập nhật x 10 lần khác nhau
  • Thực hiện 100 truy vấn xóa x 10 lần khác nhau
  • Lặp lại bốn lần, tổng cộng năm bài kiểm tra

Tôi đã ghi lại thời gian cần thiết để thực hiện từng phần của bài kiểm tra và chèn kết quả kiểm tra vào bảng tính. Tôi đã sử dụng cùng một tệp dữ liệu và truy vấn cho cả MongoDB và MySQL

Các biểu đồ sẽ hiển thị cho bạn thời gian cho từng hành động và kết quả được gắn nhãn Mongo, MySQL và MySQL-noBL (với nhật ký nhị phân bị tắt). Đối với các bài kiểm tra tìm kiếm, cập nhật và xóa, tôi đã thực hiện cùng 100 truy vấn duy nhất, 10 lần đối với mỗi cơ sở dữ liệu. Mỗi chuỗi gồm 10 bài kiểm tra được thực hiện năm lần và thời gian cần thiết để hoàn thành từng trong số 10 bài kiểm tra riêng lẻ cho từng kích thước cơ sở dữ liệu (bản ghi 10k, 100k, 1000k và 10000k) sau đó được tính trung bình cho cả năm bài kiểm tra để tạo biểu đồ. (Ghi chú. đối với bài kiểm tra này, “k” bằng 1.000 chứ không phải 1.024)

Trong khi tôi đang chạy thử nghiệm, các ứng dụng duy nhất tôi mở là trình soạn thảo văn bản, ba cửa sổ đầu cuối và chương trình bảng tính. Tuy nhiên, có một số điểm bất thường nhỏ trong kết quả kiểm tra trong đó thời gian kiểm tra sẽ lâu hơn một chút so với thời gian chạy bình thường. Tôi đã không sửa dữ liệu khi có sự bất thường xảy ra

Ngoài ra, không phải tất cả các truy vấn được trả lại hoặc sửa đổi cùng một số hàng. Ví dụ: một truy vấn cập nhật có thể thay đổi 10 hàng, trong khi một truy vấn khác thay đổi 50 hàng, do đó, thời gian kết quả của truy vấn sẽ không liên quan đến mọi truy vấn khác. Tuy nhiên, mỗi truy vấn được thực hiện theo cùng một thứ tự, do đó, thời gian chạy truy vấn #1 phải tương đối trong cả năm lần thực hiện thử nghiệm

Nhập dữ liệu

Đối với mỗi cơ sở dữ liệu trong số bốn cơ sở dữ liệu, tôi đã nhập cùng một bộ bản ghi. Điều này liên quan đến việc nhập các bản ghi 1k, 10k, 100k và 1.000k mỗi bản ghi mười lần vào cơ sở dữ liệu tương ứng của chúng

Đối với MySQL, tôi đã sử dụng MySQL Shell, một ứng dụng khách dòng lệnh. Dưới đây là một ví dụ về lệnh nhập

________số 8

Đối với MongoDB, tôi đã sử dụng tiện ích mongoimport. Dưới đây là một ví dụ về lệnh nhập

mongoimport --jsonArray --db db_json_test10k --collection json_test10k --file /Volumes/HD1/0mongo_v_mysql/1000/1000-0m

Ghi chú. Với MySQL, bạn phải cẩn thận khi nhập tài liệu JSON – nếu cú ​​pháp không chính xác, tệp có thể nhập nhưng nó sẽ không tạo bộ sưu tập (thay vào đó nó sẽ tạo bảng). Cú pháp trên lệnh nhập rất quan trọng

Đây là kết quả của việc nhập khẩu. Trục Y (đường thẳng đứng) trên biểu đồ biểu thị thời gian tính bằng giây để thực hiện hành động

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

MongoDB nhanh hơn nhiều so với MySQL trong việc nhập dữ liệu, ngay cả khi tắt nhật ký nhị phân MySQL

Tạo chỉ mục

Bất cứ khi nào bạn nhập dữ liệu vào một bộ sưu tập cho MongoDB hoặc MySQL, cả hai phiên bản sẽ tự động tạo một số chỉ mục. Sau lần nhập đầu tiên, tôi đã xem các chỉ mục

Đối với MongoDB

sudo yum install -y mongodb-org
0

Đối với MySQL

sudo yum install -y mongodb-org
1

Cả MongoDB và MySQL đều tự động tạo chỉ mục trên cột _id (cũng là khóa chính)

Tôi cần tạo một chỉ mục trên cột UBI, vì tôi sẽ sử dụng cột này để tìm kiếm, cập nhật và xóa

Tôi chỉ cần tạo các chỉ mục một lần cho mỗi loạt thử nghiệm, nhưng tôi vẫn theo dõi thời gian để cả MongoDB và MySQL tạo chỉ mục. Dưới đây là các lệnh để tạo một chỉ mục cho mỗi một

mysql

sudo yum install -y mongodb-org
2

MongoDB

sudo yum install -y mongodb-org
3

Ghi chú. MySQL lập chỉ mục các tài liệu JSON qua các cột ảo. Xem bài đăng trên blog này để được giải thích chi tiết về các cột ảo

Đối với các bài kiểm tra, tôi sẽ tạo một chỉ mục trên cả bốn cơ sở dữ liệu cho từng trường hợp. Dưới đây là kết quả của việc tạo chỉ mục cho từng cơ sở dữ liệu. Trục Y (đường thẳng đứng) trên biểu đồ biểu thị thời gian tính bằng giây cần thiết để thực hiện tác vụ

Chúng ta có thể lưu trữ json trong mongodb không?

MySQL nhanh hơn một chút so với MongoDB trong việc tạo chỉ mục

tìm kiếm

Thử nghiệm tìm kiếm bao gồm thực thi mười tập lệnh, trong đó mỗi tập lệnh thực hiện 100 truy vấn tìm kiếm. Thử nghiệm được thực hiện đối với cả bốn cơ sở dữ liệu, mỗi cơ sở dữ liệu chứa các truy vấn cập nhật của riêng chúng (có tổng cộng 40 tập lệnh riêng biệt chạy 100 truy vấn riêng biệt mỗi tập lệnh). Thử nghiệm được lặp lại năm lần và thời gian trung bình được hiển thị trong biểu đồ

Dưới đây là một ví dụ về cú pháp tìm kiếm. (Chỉ có ba truy vấn đầu tiên được hiển thị)

mysql

sudo yum install -y mongodb-org
4

MongoDB

sudo yum install -y mongodb-org
5

Các truy vấn tìm kiếm được đặt trong các tệp - tệp SQL cho MySQL và tệp JavaScript cho MongoDB - và mỗi tệp được thực thi như sau. (Chỉ có ba truy vấn đầu tiên được hiển thị)

mysql

sudo yum install -y mongodb-org
6

MongoDB

sudo yum install -y mongodb-org
7

Dưới đây là kết quả tìm kiếm cho từng cơ sở dữ liệu. Trục Y (đường thẳng đứng) trên biểu đồ biểu thị thời gian tính bằng giây cần thiết để thực hiện tác vụ

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Kết quả khác nhiều so với trong các bài kiểm tra ban đầu. MySQL nhanh hơn nhiều so với MongoDB trong tìm kiếm

Cập nhật

Thử nghiệm cập nhật bao gồm thực thi mười tập lệnh, trong đó mỗi tập lệnh chứa 100 truy vấn cập nhật duy nhất. Thử nghiệm được thực hiện đối với cả bốn cơ sở dữ liệu, mỗi cơ sở dữ liệu chứa các truy vấn cập nhật của riêng chúng (có tổng cộng 40 tập lệnh riêng biệt). Thử nghiệm được lặp lại năm lần và thời gian trung bình được hiển thị trong biểu đồ

Cú pháp cập nhật như sau

mysql

sudo yum install -y mongodb-org
8

MongoDB

sudo yum install -y mongodb-org
9

Dưới đây là kết quả cập nhật cho từng cơ sở dữ liệu. Trục Y (đường thẳng đứng) trên biểu đồ biểu thị thời gian tính bằng giây cần thiết để thực hiện tác vụ. Lưu ý rằng không phải tất cả các truy vấn đều cập nhật cùng một số hàng, do đó, kết quả sẽ không giống nhau đối với từng nhóm truy vấn

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Xóa bỏ

Thử nghiệm xóa bao gồm thực thi mười tập lệnh, trong đó mỗi tập lệnh chứa 100 truy vấn xóa duy nhất. Thử nghiệm được thực hiện đối với cả bốn cơ sở dữ liệu, mỗi cơ sở dữ liệu chứa các truy vấn cập nhật của riêng chúng (có tổng cộng 40 tập lệnh riêng biệt). Thử nghiệm được lặp lại năm lần và thời gian trung bình được hiển thị trong biểu đồ. (Tôi đã phải thêm các thay đổi vào max_join_size và DBQuery. shellBatchSize như tôi đã giải thích trước đó)

Cú pháp xóa như sau. (Chỉ có ba truy vấn đầu tiên được hiển thị)

mysql

curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install nodejs
0

MongoDB

curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install nodejs
1

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Một lần nữa, kết quả khác nhiều so với các bài kiểm tra ban đầu. MySQL nhanh hơn nhiều so với MongoDB trong việc xóa


Kết quả kiểm tra cơ sở hạ tầng đám mây của Oracle

Dưới đây là kết quả kiểm tra để chạy các thử nghiệm tương tự trên Đám mây Oracle. Quá trình nhập của MongoDB vẫn nhanh hơn nhiều. Trên các truy vấn, MongoDB hoạt động tốt hơn và trong một số thử nghiệm, MySQL chỉ cạnh tranh nếu bạn tắt nhật ký nhị phân

Nhập khẩu

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Tạo chỉ mục

Chúng ta có thể lưu trữ json trong mongodb không?

tìm kiếm

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

cập nhật

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

xóa

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?

Chúng ta có thể lưu trữ json trong mongodb không?


Kết quả từ việc chạy chỉ với một CPU thông qua OCI thật đáng ngạc nhiên

Nhìn chung, tôi nghĩ rằng phiên bản mới nhất của MySQL chắc chắn là một giải pháp thay thế tuyệt vời cho MongoDB để lưu trữ các tài liệu JSON. Nếu bạn đang sử dụng MySQL phiên bản 5. 7 để lưu trữ tài liệu JSON của bạn, tôi khuyên bạn nên nâng cấp lên phiên bản 8 mới nhất. 0 phiên bản

Cuối cùng - hãy nhớ rằng, tôi không phải là chuyên gia MongoDB. Nếu bạn có góp ý gì về cách tinh chỉnh MongoDB để chạy nhanh hơn, vui lòng để lại bình luận bên dưới

Bạn có thể lưu trữ JSON trong NoSQL không?

Bạn có thể lưu trữ tài liệu JSON trong SQL Server hoặc Cơ sở dữ liệu SQL và truy vấn dữ liệu JSON như trong cơ sở dữ liệu NoSQL . Bài viết này mô tả các tùy chọn để lưu trữ tài liệu JSON trong SQL Server hoặc Cơ sở dữ liệu SQL.

Cách tốt nhất để lưu trữ JSON trong cơ sở dữ liệu là gì?

Đối với cơ sở dữ liệu quan hệ. sử dụng một cột cho mỗi giá trị. Đặt một đốm màu JSON trong một cột khiến cho việc truy vấn hầu như không thể thực hiện được (và rất chậm khi bạn thực sự tìm thấy một truy vấn hoạt động). Cơ sở dữ liệu quan hệ tận dụng lợi thế của các loại dữ liệu khi lập chỉ mục và dự định sẽ được triển khai với cấu trúc chuẩn hóa

JSON có phải là NoSQL không?

Cơ sở dữ liệu JSON được cho là danh mục phổ biến nhất trong họ cơ sở dữ liệu NoSQL. Quản lý cơ sở dữ liệu NoQuery khác với cơ sở dữ liệu quan hệ truyền thống gặp khó khăn trong việc lưu trữ dữ liệu bên ngoài các cột và hàng

Định dạng JSON trong MongoDB là gì?

JSON là định dạng dữ liệu đại diện cho các giá trị của đối tượng, mảng, số, chuỗi, boolean và null . Định dạng JSON mở rộng xác định một bộ khóa dành riêng có tiền tố " $ " để biểu thị thông tin loại trường tương ứng trực tiếp với từng loại trong BSON, định dạng mà MongoDB sử dụng để lưu trữ dữ liệu.