2014-11-08 18 views
5

Tôi muốn để lưu trữ chuỗi thời gian trong một cơ sở dữ liệu MySQL. Tôi muốn làm điều đó trong một thời trang tuyến tính, có nghĩa là, mỗi hàng là viết tắt của một quan sát duy nhất (1 biện pháp, 1 trang web, 1 dấu thời gian). Hiện tại, nó sẽ yêu cầu 84 096 000 hàng và nó sẽ tăng khoảng 2 102 400 hàng mỗi năm.cơ sở dữ liệu lưu trữ Timeserie tuyến tính

gì biện pháp phòng ngừa phải được thực hiện để thiết kế đúng bảng chuỗi thời gian, chỉ số và truy vấn liên quan (thực chất là một lựa chọn các dữ liệu mà biện pháp, trang web và phạm vi thời gian được xác định).

Edit:

Thêm một đề nghị của thiết kế bảng:

CREATE TABLE TimeSeries(
    Id     INT   NOT NULL  AUTO_INCREMENT, 
    MeasureTimeStamp DATETIME  NOT NULL, 
    MeasureId   INT   NOT NULL, 
    SiteId    INT   NOT NULL, 
    Measure    FLOAT  NOT NULL, 
    Quality    INT   NOT NULL, 
    PRIMARY KEY (Id), 
    CONSTRAINT UNIQUE (MeasureTimeStamp,MeasureId,SiteId), 
    FOREIGN KEY (MeasureId) REFERENCES Measure(Id), 
    FOREIGN KEY (SiteId) REFERENCES Site(Id) 
); 
CREATE INDEX ChannelIndex ON TimeSeries(MeasureId,SiteId); 

Cung cấp Đo lường và bảng trang web tồn tại, những gì cần được cải thiện để cấu trúc này nếu truy vấn lớn của tôi là:

SELECT * 
FROM TimeSeries 
WHERE (MeasureId IN (?,?,?)) 
    AND (SiteId IN (?,?,?)) 
    AND (MeasureTimeStamp BETWEEN ? AND ?) 
ORDER BY MeasureId ASC, 
     SiteId ASC, 
     MeasureTimeStamp ASC; 

Chỉnh sửa 2:

Sites khoảng 20 và các biện pháp khoảng 50. Điều này dẫn đến tối đa 1000 kênh (cặp của trang web và biện pháp). Nó có thể tăng một chút trong vài thập kỷ nhưng nó sẽ không đạt được hơn 10000 kênh. Hầu hết các dữ liệu có độ thời gian khoảng 30 phút. Bất kỳ thời gian granulity không phải là không đổi, và sẽ không được nhỏ hơn một phút (một số dữ liệu được hàng ngày hoặc hàng tuần).

+0

MySQL có thể dễ dàng xử lý. Bạn dự đoán những loại mệnh đề WHERE nào? Tối thiểu, chỉ mục cho "trang web". – mainstreetmark

+0

'WHERE' khoản sẽ, ít nhất, chọn trên hai phím nước ngoài' site' và 'đo' sử dụng tiêu chí danh sách' IN' (tất cả các cột đó sẽ được lập chỉ mục) và 'dấu thời gian' bằng cách sử dụng' GIỮA '(được lập chỉ mục vì nó là một phần của khóa chính). – jlandercy

+0

Sau đó, tôi đề xuất tạo chỉ mục với cả 'site' và' measure'. Hai cột đó sẽ làm giảm kết quả đủ hiệu quả. Nếu bạn thêm Dấu thời gian vào kết hợp, thì chỉ mục của bạn sẽ có nhiều hàng như bảng dữ liệu, và MySQL sẽ bỏ qua nó. – mainstreetmark

Trả lời

1

Một số manh mối:

  • Một chỉ mục trong MySQL là một danh sách các từ khóa chính của bạn ra lệnh bằng 'cột chỉ số' của bạn. Bạn muốn đặt hàng danh sách đó theo cách dễ dàng nhất có thể để tìm các giá trị bạn cần.
  • MySQL chỉ sử dụng một chỉ mục trên một bảng cùng một lúc.
  • MySQL có thể sử dụng các chỉ số từ trái sang phải (MySQl Multi-column indexes). Điều này có nghĩa là chỉ mục (A, B, C) cho phép bạn làm WHERE A=? AND B=? nhưng không cho phép WHERE B=? AND C=?.

Trong ví dụ của bạn, bốn chỉ số được tạo ra:

  • MeasureId,SiteId (ChannelIndex)
  • MeasureTimeStamp,MeasureId,SiteId (hạn chế duy nhất)
  • MeasureId (khoá ngoại)
  • SiteId (khoá ngoại)

Simp ly đặt, ChannelIndex được sắp xếp như một danh sách các chuỗi kết hợp MeasureId và SiteId. Ví dụ. cho MeasureId = 12 và và Id trang = 68 bạn có thể tưởng tượng giá trị sắp xếp là 12_68. Loại ràng buộc duy nhất của bạn theo các giá trị như 2014-12-23 09:01:43_12_68.

Để giải quyết truy vấn của bạn, MySQL có thể sử dụng chỉ mục của bạn hoặc ràng buộc duy nhất. Nó phụ thuộc vào dữ liệu trong bảng của bạn mà nó chọn. Tuy nhiên, không phải là tối ưu. Sử dụng chỉ mục, nó sẽ nhanh chóng tìm thấy các khối trong chỉ mục có quyền MeasureIdSiteId, nhưng sau đó nó sẽ cần phải đi vào từng giá trị trong bảng chính để kiểm tra xem MeasureTimeStamp có nằm trong phạm vi không. Sử dụng ràng buộc duy nhất nó có thể dễ dàng chọn phạm vi thời gian. Tuy nhiên, tập hợp chỉ mục này có MeasureIdSiteId được sắp xếp ngẫu nhiên do vẫn còn được MeasureTimeStamp đặt hàng.

Để cải thiện cấu trúc của bạn, nó sẽ giúp thay đổi hạn chế duy nhất của bạn để

CONSTRAINT UNIQUE (MeasureId, SiteID, MeasureTimeStamp)

Đó chỉ số bây giờ sẽ loại với giá trị như 12_68_2014-12-23 09:01:43 mà tôi hy vọng sẽ hiển thị hiệu suất tốt hơn vì bây giờ MySQL có thể chọn một số phạm vi riêng biệt và có thể dự đoán được trong phạm vi chỉ mục. Điều này bao gồm câu lệnh SELECT của bạn và làm cho chỉ mục của bạn thừa trong cùng một lúc.

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