Ở kích thước dữ liệu nào có ích khi chuyển từ SQL sang NoQuery?


24

Là một lập trình viên cơ sở dữ liệu quan hệ (hầu hết thời gian), tôi đọc các bài viết về cách cơ sở dữ liệu quan hệ không mở rộng quy mô và các giải pháp NoQuery như MongoDB làm. Vì hầu hết các cơ sở dữ liệu tôi đã phát triển cho đến nay đều ở quy mô nhỏ đến trung bình, tôi chưa bao giờ gặp sự cố chưa được giải quyết bằng một số lập chỉ mục, tối ưu hóa truy vấn hoặc thiết kế lại lược đồ.

Loại kích thước nào tôi mong đợi để thấy MySQL đang vật lộn với. Có bao nhiêu hàng?

(Tôi biết điều này sẽ phụ thuộc vào ứng dụng và loại dữ liệu được lưu trữ. Cơ sở dữ liệu cho tôi về cơ bản là cơ sở dữ liệu di truyền, do đó sẽ có một bảng chính, với 3 hoặc 4 bảng tra cứu. Bảng chính sẽ chứa những thứ khác, một tham chiếu nhiễm sắc thể và tọa độ vị trí. Nó có thể sẽ được truy vấn cho một số mục giữa hai bình thuốc trên nhiễm sắc thể, để xem những gì được lưu trữ ở đó).


4
Có lẽ bạn không nên lao động theo giả định rằng MySQL là giới hạn trên cho số lượng hàng mà cơ sở dữ liệu quan hệ có thể xử lý. Bạn thực sự đang hỏi hai câu hỏi: Khi nào MySQL hết chuỗi? các giới hạn của khả năng SQL RDBMS là gì? Mà bạn muốn trả lời?
Blrfl

Câu trả lời:


13

Làm thế nào lớn một dữ liệu?

Có hai ngưỡng đáng kể:

  1. toàn bộ dữ liệu phù hợp với RAM
  2. toàn bộ dữ liệu chỉ số phù hợp với RAM

Với SSD nhanh, ngưỡng đầu tiên trở thành một vấn đề ít hơn, trừ khi bạn có lưu lượng truy cập cao.

ACIDity

Một trong những vấn đề với việc mở rộng RDBMS là do thiết kế chúng là ACID, có nghĩa là các giao dịch và khóa cấp hàng (hoặc thậm chí mức bảng trong một số RDBMS cũ / đơn giản hơn). Nó có thể là yếu tố giới hạn nếu bạn có nhiều truy vấn sửa đổi nhiều dữ liệu đang chạy cùng một lúc. Các giải pháp NoQuery thường đi theo mô hình nhất quán cuối cùng .

Làm thế nào để quy mô RDBMS trên kích thước dữ liệu?

Không hoàn toàn đúng khi RDBMS không thể mở rộng quy mô dữ liệu, có hai lựa chọn thay thế: phân vùng dọc và phân vùng ngang (hay còn gọi là shending).

Phân vùng dọc về cơ bản là giữ các bảng không liên quan trên các máy chủ DB riêng biệt, do đó giữ kích thước của mỗi bảng dưới ngưỡng được đề cập ở trên. Điều này làm cho việc tham gia các bảng này bằng cách sử dụng SQL đơn giản ít đi thẳng hơn và kém hiệu quả hơn.

Shending có nghĩa là phân phối dữ liệu từ một bảng giữa các máy chủ khác nhau, dựa trên khóa cụ thể. Điều này có nghĩa là để tra cứu bạn biết máy chủ nào sẽ truy vấn dựa trên khóa đó. Tuy nhiên, điều này làm phức tạp các truy vấn không tìm kiếm trên khóa shending.

Trong trường hợp của cả hai loại phân vùng, nếu bạn đi đến cực đoan, về cơ bản bạn sẽ gặp tình huống tương tự như cơ sở dữ liệu NoQuery.


9
Oracle, PostgreSQL, MySQL, MS SQL Server và Sybase đều có khả năng thực hiện các phép nối trên các bảng trên các máy chủ từ xa mà không cần máy khách phải thực hiện bất kỳ công việc nào.
Blrfl

4
Giới thiệu về "toàn bộ dữ liệu trong RAM" rằng đây là về bộ làm việc thực tế. Thông thường cơ sở dữ liệu lớn hơn bộ nhớ, nhưng hầu hết cơ sở dữ liệu hiếm khi được truy cập, có trên đĩa không quá tệ miễn là các chỉ mục và các hàng thường được tìm nạp, v.v. nằm trong bộ nhớ
johannes

2
@vartec Vì vậy, bạn muốn bỏ thư 2 năm tuổi của tôi khỏi cơ sở dữ liệu thư của tôi khi tôi chỉ tìm kiếm qua nó một lần mỗi tháng trong khi bộ công việc chính của tôi chỉ là mười thư cuối cùng?
johannes

3
@wobbily_col gợi ý: không phải vậy. trừ khi bạn không quan tâm đến tính nhất quán, độ tin cậy hoặc độ bền. trong trường hợp đó, bạn có thể tắt rất nhiều thứ khiến cho cái này nhanh hơn cái kia hoặc ngược lại nếu bạn muốn. đoán cấu hình mặc định trên mỗi cái là gì? (tất nhiên, MySQL cũng không phải là đỉnh cao của an toàn dữ liệu ...)
Javier

1
@vartec "Shending tự động" là tốt, nơi nó được áp dụng. Nhưng đột nhiên, bạn không thể kết hợp tất cả dữ liệu lại với nhau - ồ, chờ đã, bạn thực sự không thể làm điều đó với cơ sở dữ liệu tài liệu cũng tìm kiếm thông qua tất cả dữ liệu hoặc tạo báo cáo trở nên tẻ nhạt ... có cơ sở dữ liệu tài liệu có vị trí của chúng, khi mô hình dữ liệu và Hoạt động khớp, tương tự đối với các hệ thống khác ... chỉ riêng số lượng dữ liệu là không có yếu tố (Tôi biết có đủ các phiên bản MySQL chạy với dữ liệu trong vùng terabyte ... và các dự án với vài trăm MB không thành công)
johannes

13

Tôi không nghĩ rằng kích thước của dữ liệu là yếu tố duy nhất. "Mô hình dữ liệu" cũng là một phần rất quan trọng.

Các trang danh mục thương mại điện tử (Solr, ElasticSearch), dữ liệu phân tích web (Riak, Cassandra), giá cổ phiếu (Redis), các kết nối mối quan hệ trong Mạng xã hội (Neo4J, FleetDB) chỉ là một số ví dụ khi giải pháp NoQuery thực sự tỏa sáng.

IMHO, mô hình dữ liệu có vai trò quan trọng hơn kích thước của dữ liệu khi xem xét giải pháp NoQuery hoặc RDBMS.


9
Chính xác. tất cả "dữ liệu lớn" bla bla crap này là tiếp thị nói và toàn bộ "NoQuery cho dữ liệu lớn!" công cụ là tốt. NoQuery tốt cho các tập dữ liệu lớn vì nó nhanh hơn RDBMS truyền thống, nhưng nó nhanh hơn do sự đánh đổi tính năng rất lớn mà nó tạo ra. Nhiều mô hình dữ liệu sẽ bị ảnh hưởng đáng kể khi đánh đổi trong khi một số sẽ hoạt động tốt. Đó là vấn đề về việc bạn biết bạn đang mất gì khi truy cập NoQuery và chỉ sử dụng NoQuery cho dữ liệu có thể chịu tổn thất như vậy.
Jimmy Hoffa

1
Trong khi đó là sự thật, nó không phải là câu trả lời cho câu hỏi.
vartec

Đây không chỉ KHÔNG phải là câu trả lời, mà còn KHÔNG đúng. Bạn có thể tạo một tài liệu như bảng trong cơ sở dữ liệu SQL chỉ bằng cách sử dụng kiểu dữ liệu JSON và làm cho cơ sở dữ liệu SQL tỏa sáng trên NoQuery.
Yevgeniy Afanasyev

6

Nếu cơ sở dữ liệu quan hệ không mở rộng quy mô, không có gì. Đừng lo lắng về vấn đề mở rộng.

SQL có vấn đề với một số loại phân tích, nhưng nó không mất nhiều dữ liệu để kích hoạt vấn đề. Ví dụ: hãy xem xét một bảng duy nhất có một cột tham chiếu các hàng khác dựa trên một khóa duy nhất. Thông thường, điều này có thể được sử dụng để tạo cấu trúc cây. Bạn có thể viết các câu lệnh SQL nhanh tham chiếu hàng liên quan. Hoặc hàng liên quan của hàng liên quan. Trong thực tế, bạn có thể thực hiện bất kỳ số lần nhảy cụ thể. Nhưng nếu, đối với mỗi hàng, bạn muốn chọn một trường trên hàng liên quan đầu tiên trong chuỗi đáp ứng một số tiêu chí, thì nó trở nên phức tạp.

Xem xét một bảng các địa điểm văn phòng ở cấp quốc gia, tỉnh / bang, quận, thị trấn và làng, với mỗi văn phòng tham chiếu đến văn phòng mà nó báo cáo. Không có gì đảm bảo rằng mỗi văn phòng báo cáo của văn phòng chỉ tăng một cấp. Đối với một tập hợp các văn phòng được chọn, không phải tất cả ở một cấp, bạn muốn liệt kê từng văn phòng quốc gia được liên kết. Điều này đòi hỏi các vòng lặp của các thống kê SQL và sẽ mất nhiều thời gian ngay cả ngày hôm nay. (Tôi đã từng có 30 giây cho một lựa chọn 30 văn phòng, nhưng đó là một thời gian dài trước đây - và việc chuyển sang các thủ tục được lưu trữ đã giúp một chút.)

Vì vậy, phương án thay thế là đưa toàn bộ cấu trúc vào một khối dữ liệu lớn, gắn nhãn và lưu trữ nó. Khi bạn muốn phân tích dữ liệu, hãy đọc tất cả dữ liệu vào bộ nhớ cùng một lúc, thiết lập các con trỏ để theo dõi cấu trúc và bạn có thể xử lý một vài triệu văn phòng trong chớp mắt.

Không ai trong số này có liên quan nhiều đến lượng dữ liệu. Chìa khóa là bản chất của tổ chức dữ liệu. Nếu một bố cục quan hệ có ích, thì RDBMS là thứ bạn muốn. Nếu không, một số loại lưu trữ số lượng lớn sẽ là bất cứ thứ gì từ một chút đến một triệu triệu lần nhanh hơn.

Lưu ý rằng nếu một trong những bộ dữ liệu này trở nên quá lớn để phù hợp với bộ nhớ, cơ sở dữ liệu phi SQL của bạn sẽ không hoạt động nữa. Một vấn đề khác là khi bạn cần dữ liệu từ nhiều khối cùng một lúc; bạn có thể làm điều này nếuchỉ khi tất cả các khối khớp với bộ nhớ cùng một lúc. Và người dùng phải chờ trong khi bạn tải chúng lên.

Nếu cơ sở dữ liệu quan hệ của bạn sẽ gây ra sự cố cho bạn, nó sẽ làm như vậy trước khi bạn đưa nhiều dữ liệu vào đó. Vấn đề mở rộng duy nhất bạn có thể gặp phải là với chương trình của bạn khi khối dữ liệu bạn đang lắp ráp cho DB nosql - nếu bạn phải sử dụng một - sẽ trở nên quá lớn đối với nó. (Không đọc các lỗi hết bộ nhớ. Các ngôn ngữ mới hơn đôi khi làm những điều lạ với bộ nhớ.)


0

Tôi nghĩ rằng lý do đầu tiên để đi đến một giải pháp NoQuery hoặc phân tán không phải là kích thước của tất cả các dữ liệu, mà là kích thước của các bảng. Những giải pháp phân tán nào làm tốt là chia bảng thành các nút khác nhau sau đó khi bạn cần truy vấn các bảng, mỗi nút sẽ xử lý phần của bảng.

Các RDBMS có thể làm điều này, nhưng làn sóng cơ sở dữ liệu NoQuery mới đã được xây dựng để làm điều này. Oracle, MSSQL, MySQL đã lấy mô hình tập trung của họ và điều chỉnh nó để làm cho nó hoạt động trong một môi trường phân tán. Tuy nhiên, họ vẫn tuân thủ các quy tắc ACID nghiêm ngặt trong khi một số cơ sở dữ liệu mới không tuân thủ các quy tắc nghiêm ngặt như bằng cách sử dụng tính nhất quán cuối cùng.

Không có một lượng dữ liệu nào được đặt trong đó bạn nên chọn cái khác. Những gì cần phải được tính đến là nhu cầu của cơ sở dữ liệu và lượng sử dụng nó nhận được. Cơ sở dữ liệu NoQuery có thể xử lý các bộ dữ liệu lớn hơn nhanh hơn trong khi cơ sở dữ liệu quan hệ cung cấp cho bạn sự tin cậy rằng dữ liệu của bạn là chính xác với các nguyên tắc ACID.


0

Cũng có thể đáng giá khi đề cập rằng mô hình dữ liệu của bạn có ảnh hưởng lớn đến mọi thứ. Nếu bạn thấy mình cần tạo một số dạng cấu trúc cây (tức là bạn có một khóa ngoại tự tham chiếu trên một bảng có chứa khóa ngoại đã nói trong khóa chính ghép), có lẽ bạn nên xem xét việc đó trong một dạng cơ sở dữ liệu nào đó xử lý chúng các loại dữ liệu thực sự tốt (như mongodb hoặc couchdb).

Giống như những người khác đã nói bạn cũng nên xem xét những gì đang xảy ra trong ứng dụng của bạn. nếu bạn thực sự cần ACID trên nhiều bảng thì bạn thực sự cần phải gắn bó với RDBMS, nhưng nếu bạn có thứ gì đó mà bạn có thể có một số dữ liệu hơi cũ và bạn cần sự linh hoạt của lược đồ NoQuery (hãy gọi nó là schemaless nếu bạn thích nhưng nó vẫn còn một số dạng lược đồ ngầm), sau đó bạn có thể xem xét lấy một cửa hàng NoQuery ( http://www.10gen.com/customers/craigslist ở đây là một ví dụ về lý do tại sao craigslist chuyển qua ... nhưng phải thừa nhận rằng họ đang lưu trữ ~ 10TB dữ liệu mà tôi biết hoàn toàn không phù hợp với kích thước cơ sở dữ liệu vừa và nhỏ của bạn. Nhưng trường hợp sử dụng có thể hữu ích).

Hãy nhớ rằng các hệ thống NoQuery không nhất thiết phải thay thế RDMS nhưng trong nhiều trường hợp, bạn có thể bổ sung RDBMS của mình thông qua ý tưởng về Polyglot Persistence và bạn có thể lưu trữ hầu hết dữ liệu của mình trong RDBMS nhưng trong các trường hợp cụ thể, bạn có thể giảm tải một số dữ liệu cho một số hình thức của cửa hàng NoQuery.


0

Mongocó thể được cài đặt trên một số máy tính / nút. PostgreSQLkhông cung cấp công cụ tích hợp để shending, tuy nhiên citus ở xung quanh.

MongoDB hỗ trợ cơ sở dữ liệu lên tới 64 terabyte và kích thước tài liệu là 16 megabyte.

MySQL có giới hạn cơ sở dữ liệu là 256 terabyte, 64 terabyte kích thước tối đa cho một bảng và giới hạn bản ghi là 4 gigabyte

PostgreSQL không có giới hạn về cơ sở dữ liệu (4 terabyte tồn tại ở đâu đó để thử nghiệm) và nó có giới hạn 1 gigabyte cho kích thước của bất kỳ một trường nào trong một bảng và lại kích thước tối đa 64 terabyte cho một bảng.

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.