Trong ứng dụng của chúng tôi, chúng tôi thu thập dữ liệu về hiệu suất động cơ ô tô - về cơ bản là dữ liệu nguồn về hiệu suất động cơ dựa trên loại động cơ, xe chạy và thiết kế động cơ. Hiện tại, cơ sở cho chèn hàng mới là thời gian tắt động cơ; chúng tôi theo dõi các biến hiệu suất dựa trên sự thay đổi trạng thái động cơ từ hoạt động thành không hoạt động và ngược lại. Các engineState
bảng có liên quan như sau:Trong MySQL, thiết kế truy vấn hiệu quả nhất để gia nhập các bảng lớn với nhiều mối quan hệ giữa các biến vị ngữ nối là gì?
+---------+-----------+---------------+---------------------+---------------------+-----------------+
| vehicle | engine | engine_state | state_start_time | state_end_time | engine_variable |
+---------+-----------+---------------+---------------------+---------------------+-----------------+
| 080025 | E01 | active | 2008-01-24 16:19:15 | 2008-01-24 16:24:45 | 720 |
| 080028 | E02 | inactive | 2008-01-24 16:19:25 | 2008-01-24 16:22:17 | 304 |
+---------+-----------+---------------+---------------------+---------------------+-----------------+
Đối với một phân tích cụ thể, chúng tôi muốn phân tích nội dung bảng dựa trên một granularity hàng phút, chứ không phải là cơ sở hiện hành của nhà nước động cơ hoạt động/không hoạt động. Đối với điều này, chúng tôi đang nghĩ đến việc tạo một bảng đơn giản productionMinute
với một hàng cho mỗi phút trong giai đoạn chúng tôi đang phân tích và tham gia các bảng productionMinute
và engineEvent
trên cột ngày-thời gian trong mỗi bảng. Vì vậy, nếu giai đoạn phân tích của chúng tôi là từ 2009-12-01 đến 2010-02-28, chúng tôi sẽ tạo một bảng mới với 129.600 hàng, một cho mỗi phút mỗi ngày trong khoảng thời gian ba tháng đó. Vài hàng đầu tiên của bảng productionMinute
:
+---------------------+
| production_minute |
+---------------------+
| 2009-12-01 00:00 |
| 2009-12-01 00:01 |
| 2009-12-01 00:02 |
| 2009-12-01 00:03 |
+---------------------+
sự tham gia giữa các bảng sẽ là:
FROM engineState AS es
LEFT JOIN productionMinute AS pm ON pm.production_minute >= es.state_start_time
AND pm.production_minute <= es.event_end_time
này tham gia, tuy nhiên, sẽ trả về nhiều vấn đề môi trường:
- các
engineState
bảng có 5 triệu hàng và bảngproductionMinute
có 130.000 hàng - Khi một
engineState
hàng kéo dài hơn một phút (tức là sự khác biệt giữaes.state_start_time
vàes.state_end_time
lớn hơn một phút), như là trường hợp trong ví dụ trên, có rất nhiều hàngproductionMinute
bảng mà tham gia vào một hàngengineState
bảng duy nhất - Khi có nhiều hơn một động cơ đang hoạt động trong bất kỳ cho phút, cũng như mỗi ví dụ trên, nhiều
engineState
hàng bảng tham gia vào mộtproductionMinute
hàng duy nhất
Trong thử nghiệm luận lý của chúng tôi và chỉ sử dụng một chiết xuất bàn nhỏ (một ngày nào đó chứ không phải là 3 tháng, cho bảng productionMinute
) truy vấn mất hơn một giờ để tạo. Trong nghiên cứu mục này để cải thiện hiệu suất để có thể truy vấn ba tháng dữ liệu, suy nghĩ của chúng tôi là tạo một bảng tạm thời từ bảng engineEvent
, loại bỏ bất kỳ dữ liệu bảng nào không quan trọng cho phân tích và tham gia bảng tạm thời cho bảng productionMinute
. Chúng tôi cũng đang có kế hoạch thử nghiệm với các kết nối khác nhau - đặc biệt là sự tham gia bên trong - để xem liệu điều đó có cải thiện hiệu suất hay không.
Thiết kế truy vấn tốt nhất để nối các bảng với nhiều: nhiều mối quan hệ giữa các biến vị ngữ nối như được nêu ở trên là gì? Loại kết nối tốt nhất (trái/phải, bên trong) là gì?
Ví dụ cụ thể về loại báo cáo bạn đang cố tạo sẽ giúp ích gì. Nó là khá có thể là bạn không cần phải mở rộng vào quan sát mỗi phút và có thể xây dựng kết quả của bạn trực tiếp. Ngoài ra, bạn có chỉ mục nào trên bảng engineState của mình? – Martin
Khiếu nại số 2 và 3 của bạn không phải là vấn đề môi trường, chúng là vấn đề thiết kế. Điều tôi muốn nói là tôi không thể thấy bất cứ điều gì sai trái với một trong hai điều đó - chúng đúng bởi vì bạn đã đặt ra dữ liệu của bạn theo cách đó. Bạn cần mô tả lý do tại sao bạn thấy đó là một vấn đề và làm cho nó rõ ràng những gì bạn mong đợi từ việc tham gia mà bạn đã viết (ý nghĩa ngữ nghĩa nào bạn muốn gán cho nó: D). – Unreason