एसक्यूएल क्वेरी में कई पंक्तियां होती हैं जब कई पंक्तियां - mysql, प्रदर्शन

क्वेरी का प्रयोग करना:

SELECT st.*
FROM surf_times st
WHERE st.Time =
(SELECT MIN(t.Time)
FROM surf_times t
WHERE t.SteamID = st.SteamID AND t.Map = st.Map)
AND st.Map = "surf_milkyway"
ORDER BY st.Time
LIMIT 15

7 परिणामों के साथ 0.15 ~ सेकंड लेता है:

Showing rows 0 - 6 (7 total, Query took 0.1650 sec) [Time: 61.76 - 70.05]

इस क्वेरी को एक टेबल पर चलाते समय 15 परिणाम लौटाएंगे, यह अचानक 23 सेकंड लेता है

Showing rows 0 - 14 (15 total, Query took 23.0710 sec) [Time: 47 - 52.13]

"surf_milkyway" में 17 कुल पंक्तियां हैं और निष्पादित करने के लिए 0.16 ~ सेकेंड लगते हैं।

"surf_beginner" में 2496 कुल पंक्तियां हैं और निष्पादित करने के लिए 23 ~ सेकंड लगते हैं।

जब नक्शा खोजा जाता है तो इसमें 20+ सेकंड लगते हैं, तालिका में कई परिणाम होते हैं और उन्हें तुलना करने और उन्हें सॉर्ट करने में लंबा समय लगता है। क्या यह क्वेरी के साथ कुछ गलत है या जिस तरह से तालिका अनुक्रमित है आदि?

तालिका के रूप में संरचित है:

SteamID - bigint(20)
Name - varchar(255)
Map - varchar(255)
Time - float
Date int(20)
id - int(11) - AUTO_INCREMENT, Primary

उत्तर:

उत्तर № 1 के लिए 1

एक असंबद्ध क्वेरी हमेशा एक सहसंबंधित से बेहतर प्रदर्शन करेगी, लेकिन यदि प्रदर्शन अभी भी खराब है तो हमें वास्तव में तालिका को स्टेटमेंट बनाने और EXPLAIN के नतीजे देखने की आवश्यकता है ...

SELECT a.*
FROM surf_times a
Join
(SELECT steamid,map, MIN(Time) min_time
FROM surf_times
Group by steamid,map) b
On b.steamid = a.steamid
And b.map = a.map
And b.min_time = a.time
Where a.Map = "surf_milkyway"
ORDER BY a.Time
LIMIT 15

जवाब के लिए 0 № 2

निम्नलिखित इंडेक्स जोड़ने से प्रदर्शन में सुधार होगा:

INDEX(Steamid, Map, Time),
INDEX(Map, Time)

संबंधित सवाल
सबसे लोकप्रिय