Quét một tỷ hàng trong cơ sở dữ liệu cực nhanh


9

Lý lịch

Một cơ sở dữ liệu cục bộ chứa gần 1,3 tỷ hàng duy nhất. Mỗi hàng được liên kết gián tiếp với một vĩ độ và kinh độ cụ thể (vị trí). Mỗi hàng có một dấu ngày.

Ca sử dụng

Vấn đề như sau:

  1. Người dùng đặt ngày bắt đầu / ngày kết thúc và một phạm vi các giá trị (ví dụ: 100 đến 105).
  2. Hệ thống tập hợp tất cả các hàng khớp với ngày đã cho, được nhóm theo vị trí.
  3. Hệ thống thực hiện xác định các vị trí, trong những ngày đó, có khả năng thống kê rơi vào phạm vi giá trị nhất định.
  4. Hệ thống hiển thị tất cả các vị trí phù hợp với người dùng.

Đây là một vấn đề về tốc độ và quy mô.

Câu hỏi

Kiến trúc giải pháp ít tốn kém nhất bạn có thể tưởng tượng sẽ cho phép một hệ thống như vậy lấy kết quả cho người dùng trong vòng năm giây là gì?

Hệ thống hiện tại

Môi trường hiện tại là:

  • PostgreQuery 8.4 (có thể nâng cấp; chuyển đổi cơ sở dữ liệu không phải là một tùy chọn)
  • R và PL / R
  • XFS
  • WD VelociRaptor
  • RAM 8 GB (Corsair G.Skill; 1,3 GHz)
  • Lõi lõi tứ chính hãng 7 (2,8 GHz)
  • Ubuntu 10.10

Nâng cấp phần cứng được chấp nhận.

Cập nhật - Cấu trúc cơ sở dữ liệu

Hàng tỷ hàng nằm trong một bảng giống như:

id | taken | location_id | category | value1 | value2 | value3
  • id - Khóa chính
  • lấy - Ngày được chỉ định cho hàng
  • location_id - Tham chiếu đến vĩ độ / kinh độ
  • thể loại - Mô tả dữ liệu
  • value1 .. 3 - Các giá trị khác mà người dùng có thể truy vấn

Các takencột thường ngày liên tiếp mỗi location_id, đôi khi mỗi địa điểm có dữ liệu 1800-2010 (khoảng 77.000 ngày, nhiều trong số họ đôi khi mỗi vị trí có dữ liệu trong phạm vi ngày giống nhau).

Có bảy loại và các bảng đã được phân chia theo thể loại (sử dụng bảng con). Mỗi danh mục chứa ~ 190 triệu hàng. Trong tương lai gần, số lượng hàng trên mỗi danh mục sẽ vượt quá một tỷ.

Có khoảng 20.000 địa điểm và 70.000 thành phố. Các vị trí tương quan với thành phố theo vĩ độ và kinh độ. Chỉ định từng vị trí cho một thành phố cụ thể có nghĩa là tìm ranh giới của thành phố, đây không phải là một nhiệm vụ tầm thường.

Ý tưởng

Một số ý tưởng tôi có bao gồm:

  • Tìm một dịch vụ đám mây để lưu trữ cơ sở dữ liệu.
  • Tạo một sọc đột kích SSD (video tuyệt vời).
  • Tạo một bảng kết hợp tất cả các vị trí theo thành phố (tính toán trước).

Cảm ơn bạn!


10
"chuyển đổi cơ sở dữ liệu không phải là một lựa chọn" cũng giúp loại bỏ hầu hết các giải pháp. chúc may mắn!
Steven A. Lowe

1
Thật khó để nói mà không có thêm thông tin về chính xác những gì bạn đang làm với những hồ sơ đó. Ngoài ra, bạn đang tìm kiếm trường hợp xấu nhất 5 giây (có thể có nghĩa là mọi hồ sơ được kiểm tra và không có vị trí nào khớp)?
Guy Sirton

2
@Dave: Hệ thống hiện tại mất bao nhiêu thời gian? Là hệ thống hiện tại sử dụng PostGIS ? Là location_idmột geographyhoặc geometry, hoặc đề cập đến một bảng thứ hai? Là location_idcột được lập chỉ mục?
rwong

1
@ Thorbjørn & @Darknight - Trong phần ý tưởng tôi liệt kê tính toán trước, việc này sẽ giảm dữ liệu xuống một giá trị mỗi thành phố mỗi ngày (mỗi danh mục). Tính toán có thể tái diễn hàng năm, hoặc thậm chí hàng tháng, tôi cho rằng. Đây là kế hoạch của tôi nếu không có khả năng nào khác (các tính toán có thể sẽ mất vài tuần).
Dave Jarvis

1
@Dave, rất nhiều khả năng, nhưng câu hỏi là những gì có liên quan đến bạn. Bạn đã điều tra nơi tắc nghẽn hiện tại chưa?

Câu trả lời:


12

Điều quan trọng nhất là phải tuyệt đối chắc chắn nơi hiện tại nút cổ chai đối với một số yêu cầu đại diện nhất định vì bạn không thể chuyển đổi cơ sở dữ liệu.

Nếu bạn thực hiện quét toàn bộ bảng, bạn cần các chỉ mục thích hợp.

Nếu bạn đợi trên I / O, bạn cần thêm bộ nhớ để lưu vào bộ đệm (Jeff Atwood gần đây đã đề cập rằng 24 hệ thống Gb có thể truy cập được trên các hệ thống máy tính để bàn).

Nếu bạn đợi CPU, bạn cần xem liệu tính toán của mình có thể được tối ưu hóa hay không.

Điều này đòi hỏi một chiếc mũ DBA nhọn và chiếc mũ Hệ điều hành, nhưng nó đáng để đảm bảo bạn đang sủa đúng cây.


Bao giờ bạn cắt và xắt nó - ngay cả khi mỗi hàng chỉ mất 100 byte, 1,3 tỷ hàng = 121 GB. Với tất cả các chỉ số của bạn, vv, tôi chắc chắn rằng điều này sẽ nhiều hơn nữa. Trên một hộp duy nhất, bạn sẽ bị chậm trừ khi bạn có một số phần cứng nghiêm trọng xung quanh SSD + Tấn của ram. Cách rẻ hơn là quy mô trên các hộp.
Subu Sankara Subramanian

4
@Subu, bạn muốn đi phân phối? Bây giờ bạn có hai vấn đề ...

Heh - tôi đồng ý với :) Nhưng nó rẻ hơn!
Subu Sankara Subramanian

@ Thorbjørn: Cảm ơn bạn đã dành thời gian và tất cả sự giúp đỡ của bạn. Tôi nghĩ rằng tôi sẽ giảm tập dữ liệu xuống còn 25 triệu hàng cho mỗi danh mục sau đó áp dụng các chỉ mục vào ngày. Điều đó sẽ làm giảm việc quét xuống ~ 70000 hàng (mỗi ngày, với giới hạn hai tuần cho phạm vi), điều này sẽ khá linh hoạt.
Dave Jarvis

@Dave, bạn vẫn cần biết nút thắt của bạn ở đâu. Tìm hiểu nó trong khi bạn không phải .

4

Làm thế nào về việc phân vùng bảng thành nhiều phần nằm trên các máy chủ khác nhau dựa trên dấu ngày? Đây là khả năng mở rộng theo chiều ngang và miễn là bạn có đủ số lượng hộp, bạn có thể viết một công cụ tổng hợp nhỏ trên đầu các thiết lập này.

Nếu bạn thấy tem ngày thay đổi quá nhiều, thì bạn có thể phân vùng dựa trên các vị trí - một lần nữa có thể mở rộng theo chiều ngang. (Hy vọng họ không thêm nhiều vĩ độ / kinh độ nữa!)


Cảm ơn bạn cho những ý tưởng. Có khả năng 77.066 ngày và ngày mới sẽ được thêm vào trong tương lai. Tôi có một máy duy nhất. Có 20.000 vị trí, nhưng việc phân chia theo vị trí sẽ không giúp ích vì dữ liệu để phân tích kéo dài tất cả các vị trí.
Dave Jarvis

và sử dụng đám mây khác với giải pháp trên như thế nào?
Chani

Đây là những gì tôi nghĩ là tốt. Một số loại phân vùng ngang để tìm kiếm có thể xảy ra song song trên tất cả các phân vùng.
davidk01

Chia tách vào ngày có lẽ sẽ hữu ích nhất, dẫn đến 2562 bảng riêng biệt (365 ngày x 7 loại).
Dave Jarvis

4

Trường hợp xấu nhất là phạm vi ngày bao gồm tất cả các ngày trong cơ sở dữ liệu của bạn.

Bạn đang tìm cách đọc 1,3 tỷ bản ghi và thực hiện một số phân tích trên mỗi bản ghi so với các giá trị được nhập, trên một máy vật lý, trong chưa đầy 5 giây. Kết quả có thể là tất cả các địa điểm hoặc không có gì - bạn không biết gì trước.

Cho những thông số này tôi sẽ nói có khả năng là không thể.

Chỉ cần nhìn vào ổ cứng của bạn: tốc độ duy trì tối đa là dưới 150MB / s. Đọc 1,3 tỷ hồ sơ sẽ mất hơn 5 giây. Thông minh về CPU, bạn sẽ không thể thực hiện bất kỳ loại phân tích thống kê nào trên 1,3 tỷ bản ghi trong 5 giây.

Hy vọng duy nhất của bạn (tm :-)) là tìm kiếm một số loại chức năng tra cứu dựa trên các giá trị được nhập bởi người dùng sẽ thu hẹp tìm kiếm (theo một vài bậc độ lớn). Bạn có thể tính toán chức năng tra cứu này nhé. Không biết thêm về các tiêu chí khớp chính xác, tôi không nghĩ ai có thể cho bạn biết cách thực hiện điều đó nhưng một ví dụ sẽ là phân vùng phạm vi của các giá trị thành một khoảng riêng biệt và tạo một tra cứu cung cấp cho bạn tất cả các bản ghi trong khoảng đó. Miễn là khoảng thời gian đủ nhỏ, bạn có thể thực hiện công việc thực sự trong đó, ví dụ: cắt tỉa các mục không khớp với giá trị đã nhập của người dùng. Về cơ bản không gian giao dịch cho thời gian.

Có thể giữ tất cả các bản ghi (hoặc ít nhất là phần quan trọng) trong bộ nhớ. Có lẽ không phải trong 8GB. Điều này ít nhất sẽ loại bỏ phần I / O của đĩa mặc dù ngay cả băng thông bộ nhớ có thể không đủ để quét qua mọi thứ trong 5 giây. Ở mức độ nào, đây là một kỹ thuật khác để tăng tốc các loại ứng dụng này (kết hợp với đề xuất trước đây của tôi).

Bạn đề cập đến việc sử dụng một dịch vụ đám mây. Có nếu bạn trả đủ CPU và cơ IO và phân vùng cơ sở dữ liệu của bạn trên nhiều máy chủ, bạn có thể bắt buộc / phân chia và chinh phục nó.


Cảm ơn bạn đã trả lời. Nâng cấp phần cứng là một cân nhắc, theo những ý tưởng tôi liệt kê. Một giải pháp trị giá $ 750 USD sẽ là lý tưởng.
Dave Jarvis

2

Tôi thứ hai nhận xét cho câu hỏi: PostgreSQL cung cấp các loại và công cụ chỉ mục thích hợp (chỉ mục GIST, chỉ mục GIN, Postgis, loại hình học) theo cách mà dữ liệu liên quan đến geodata và datetime có thể tìm kiếm được theo các tiêu chí đó mà không gặp nhiều vấn đề.

Nếu các truy vấn của bạn trên các tiêu chí này mất vài giây, điều đó có thể có nghĩa là không có chỉ mục nào như vậy đang được sử dụng. Bạn có thể xác nhận rằng bạn đã điều tra những điều này là phù hợp?


Cảm ơn bạn. Bảy bảng con được nhóm trên vị trí, ngày và danh mục bằng cách sử dụng btree. Tôi đã nghiên cứu các chỉ số GIN năm ngoái và họ đã không (hoặc sẽ không giúp đỡ), như tôi nhớ lại.
Dave Jarvis

2
Vị trí lập chỉ mục dựa trên B-Tree không phải là một chút hữu ích khi xem xét loại tìm kiếm bạn đang tìm kiếm. Bạn cần một chỉ mục đảo ngược hoạt động với các toán tử cần thiết, trong trường hợp Postgis thường có nghĩa là GIST. Bạn có thể muốn làm nổi bật một vài truy vấn chậm ...
Denis de Bernardy

1

Nếu bạn sử dụng PostgreSQL và dữ liệu vĩ độ / kinh độ, bạn chắc chắn cũng nên sử dụng PostGIS, theo cách đó bạn có thể thêm chỉ mục không gian GiST vào cơ sở dữ liệu của mình để giúp tăng tốc mọi thứ.

Tôi có một bảng như vậy (với 350 nghìn hàng) với cấu hình nhỏ hơn nhiều so với của bạn (RAM 2 lõi và RAM 2Gb) nhưng các tìm kiếm chỉ mất chưa đến một giây.


0

Có lẽ bạn có thể phá vỡ một mô hình quan hệ như Essbase đã làm với kiến ​​trúc OLAP của họ: Essbase Wikipedia

Ý tôi là tạo một bảng cho mỗi thành phố, do đó kết thúc với hơn 1000 bảng. Không phải một bảng như bạn đề xuất, nhưng nhiều bảng. Lập chỉ mục mỗi bảng theo ngày và vị trí. Nhiều bảng, nhiều chỉ mục -> nhanh hơn.


Cảm ơn đã lưu ý. Có hơn 70.000 thành phố và nhiều giá trị vĩ độ / kinh độ khác nhau nằm trong một khu vực thành phố cụ thể.
Dave Jarvis

@Dave: bạn có thể xây dựng một sơ đồ voronoi cho các thành phố và phân loại các giá trị lat / lon thành các tessellations không? (nghĩa là nếu nó nghe có vẻ khó hiểu, hãy để nó.) Sau đó, trong quá trình tra cứu, bạn sẽ tìm kiếm tất cả các thành phố có tessname chạm vào phạm vi lat / lon của truy vấn. Nếu voronoi tessname quá chậm, hộp vuông (ví dụ 5 độ lat x 5 độ lon) có thể đáng để thử.
rwong

0

Theo như ý tưởng của bạn về việc tìm kiếm một dịch vụ đám mây để lưu trữ cơ sở dữ liệu, bạn đã bắt gặp SimpleGeo chưa? Họ chỉ cắt băng khánh thành dịch vụ Lưu trữ dường như "được điều chỉnh cụ thể để lưu trữ và truy vấn dữ liệu vị trí thực sự rất nhanh" - mặc dù chi phí để lưu trữ và truy vấn đối với hơn một tỷ hàng có thể khiến phương pháp này không khả thi.


-2

bạn đang mong đợi một chiếc xe đạp chạy trên đường cao tốc. Hiện tại bạn đang tìm kiếm một giải pháp để chỉ giải quyết vấn đề này, bạn không thấy trước vấn đề gì nếu bạn có 2 tỷ hồ sơ? khả năng mở rộng phải được giải quyết. Câu trả lời là sử dụng đơn giản cơ sở dữ liệu đối tượng. ví dụ: bộ đệm Intersystems

và tin bạn đi, tôi không đến từ các hệ thống giao nhau ;-)

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.