ठीक है, क्वेरी ऑप्टिमाइज़र को मेरे पिछले उत्तर के साथ बड़ी तालिकाओं के साथ कुछ समस्याएं हैं। इसके बजाय इस समाधान को आजमाएं, यह आश्रित उपश्रेणियों के साथ काम करता है:
SELECT DATE_FORMAT(timeTable.minuteTime, '%Y-%m-%d %k:%i') time,
T2.temp temp,
S2.solids solids,
P2.Ph Ph
FROM
(
SELECT minuteTime.minuteTime minuteTime,
( SELECT MAX(time) FROM temperature WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) tempTime,
( SELECT MAX(time) FROM ph WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) phTime,
( SELECT MAX(time) FROM solids WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) solidsTime
FROM
(
SELECT time + INTERVAL 59 - SECOND( time ) SECOND minuteTime
FROM Ph
WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
UNION SELECT time + INTERVAL 59 - SECOND( time ) SECOND
FROM solids
WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
UNION SELECT time + INTERVAL 59 - SECOND( time ) SECOND
FROM temperature
WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
GROUP BY 1
) minuteTime
) timeTable
LEFT JOIN temperature T2 ON T2.time = timeTable.tempTime
LEFT JOIN solids S2 ON S2.time = timeTable.solidsTime
LEFT JOIN ph P2 ON P2.time = timeTable.phTime
ORDER BY minuteTime ASC
मैंने तीन तालिकाओं को परीक्षण डेटा की लगभग 800'000 पंक्तियों के साथ सेट किया है, प्रत्येक। MySQL 5.5.30 पर, उपरोक्त क्वेरी लगभग 3.5 सेकंड में चलती है और 61 परिणाम पंक्तियाँ लौटाती है। लेकिन आपके पास प्रत्येक समय कॉलम पर बिल्कुल इंडेक्स होना चाहिए:
ALTER TABLE `ph` ADD INDEX ( `time` ) ;
ALTER TABLE `solids` ADD INDEX ( `time` ) ;
ALTER TABLE `temperature` ADD INDEX ( `time` ) ;
अन्यथा, क्वेरी समाप्त नहीं होगी। मुझे विश्वास है कि इस मात्रा में डेटा को संभालने वाली कोई क्वेरी नहीं होगी।