2008-10-09 18 views
6

Tôi đang thiết lập một cơ sở dữ liệu SQLite đơn giản để giữ các chỉ số cảm biến. Các bảng sẽ trông giống như thế này:Có bao nhiêu hàng có thể một bảng SQLite giữ trước khi truy vấn trở thành thời gian comsuming

sensors 
- id (pk) 
- name 
- description 
- units 

sensor_readings 
- id (pk) 
- sensor_id (fk to sensors) 
- value (actual sensor value stored here) 
- time (date/time the sensor sample was taken) 

Ứng dụng này sẽ được khai thác khoảng 100.000 cảm biến mỗi tháng từ khoảng 30 cảm biến khác nhau, và tôi muốn giữ tất cả các cảm biến trong DB càng lâu càng tốt.

Hầu hết các truy vấn sẽ theo hình thức

SELECT * FROM sensor_readings WHERE sensor_id = x AND time > y AND time < z 

Truy vấn này thường sẽ trở về 100-1000 kết quả.

Câu hỏi đặt ra là bảng sensor_readings lớn đến mức nào trước khi truy vấn trên trở nên quá tốn thời gian (hơn một vài giây trên PC chuẩn).

Tôi biết rằng một bản sửa lỗi có thể là tạo một bảng sensor_readings riêng biệt cho mỗi cảm biến, nhưng tôi muốn tránh điều này nếu không cần thiết. Có cách nào khác để tối ưu hóa lược đồ DB này không?

Trả lời

2

Bạn có thiết lập chỉ mục đúng cách không? Bên cạnh đó và đọc http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html, câu trả lời duy nhất là 'bạn sẽ phải đo lường chính mình' - đặc biệt vì điều này sẽ phụ thuộc nhiều vào phần cứng và cho dù bạn đang sử dụng cơ sở dữ liệu trong bộ nhớ hay trên đĩa, và nếu bạn bọc chèn trong giao dịch hay không. Điều đó đang được nói, tôi đã đạt được sự chậm trễ đáng chú ý sau một vài chục nghìn hàng, nhưng điều đó hoàn toàn không được tối ưu hóa - từ đọc một chút, tôi có ấn tượng rằng có những người có hàng trăm nghìn hàng với các chỉ mục thích hợp, vv, những người không có vấn đề gì cả.

4

Nếu bạn định sử dụng time trong các truy vấn, việc thêm chỉ mục vào đó là đáng giá. Đó sẽ là tối ưu hóa duy nhất tôi sẽ đề xuất dựa trên thông tin của bạn.

100.000 lần chèn mỗi tháng tương đương với khoảng 2,3 mỗi phút để một chỉ mục khác không quá quan trọng và nó sẽ tăng tốc truy vấn của bạn. Tôi giả định rằng 100.000 lần chèn trên tất cả 30 cảm biến, không phải 100.000 cho mỗi cảm biến nhưng, ngay cả khi tôi bị nhầm lẫn, 70 lần chèn mỗi phút vẫn sẽ ổn.

Nếu hiệu suất trở thành vấn đề, bạn có tùy chọn để tải dữ liệu cũ xuống bảng lịch sử (ví dụ: sensor_readings_old) và chỉ thực hiện truy vấn của bạn trên bảng không lịch sử (sensor_readings).

Sau đó, ít nhất bạn có tất cả dữ liệu có sẵn mà không ảnh hưởng đến các truy vấn thông thường. Nếu bạn thực sự muốn nhận được dữ liệu cũ hơn, bạn có thể làm như vậy nhưng bạn sẽ biết rằng các truy vấn có thể mất nhiều thời gian hơn.

1

Tôi biết tôi đến muộn như thế này, nhưng tôi nghĩ điều này có thể hữu ích cho bất cứ ai mà đến nhìn vào câu hỏi này sau:

SQLite có xu hướng được tương đối nhanh về đọc càng lâu càng nó chỉ phục vụ một ứng dụng/người dùng duy nhất tại một thời điểm. Đồng thời và chặn có thể trở thành vấn đề với nhiều người dùng hoặc các ứng dụng truy cập vào nó tại một thời điểm duy nhất và cơ sở dữ liệu mạnh mẽ hơn như MS SQL Server có xu hướng làm việc tốt hơn trong một môi trường tương tranh cao.

Như những người khác đã nói, tôi chắc chắn sẽ lập chỉ mục bảng nếu bạn quan tâm đến tốc độ truy vấn đọc. Đối với trường hợp cụ thể của bạn, tôi có lẽ sẽ tạo một chỉ mục bao gồm cả id và thời gian.

Bạn cũng có thể muốn chú ý đến tốc độ ghi. Chèn có thể nhanh, nhưng cam kết chậm, vì vậy bạn có thể muốn gộp nhiều lần chèn vào cùng một giao dịch trước khi nhấn cam kết. Điều này được thảo luận tại đây: http://www.sqlite.org/faq.html#q19

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