2012-01-20 20 views
5

मुझे अपनी साइट पर ऑनलाइन उपयोगकर्ताओं का ट्रैक रखने की आवश्यकता है ताकि मैं ऑनलाइन उपयोगकर्ताओं के अवतार के बगल में एक "ऑनलाइन" आइकन दिखा सकूं।मेरी माईएसQL क्वेरी तेज क्यों होती है जब मैं इसे इस तरह करता हूं और धीमा करता हूं जब मैं इसे इस तरह करता हूं?

UPDATE `users` 
SET `last_seen` = CURRENT_TIMESTAMP 
WHERE `user_id` = '$user_id' 

अब सही इस के बाद, मैं निष्पादित करें:

इस का पता लगाने के लिए पहला कदम है जब उपयोगकर्ता पिछले देखा गया था का ट्रैक रखने के तो मैं एक अद्यतन क्वेरी हर बार उपयोगकर्ता किसी पृष्ठ का अनुरोध कर रहा हूँ है किसी अन्य क्वेरी, यह एक तो मैं उन्हें मुखपृष्ठ पर प्रदर्शित कर सकते हैं कुछ कसौटी के तहत अपनी साइट के सभी उपयोगकर्ताओं हो जाता है:

SELECT *, 
(ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) AS SearchRadius 
FROM `users` 
INNER JOIN `profiles` ON (
    users.user_id = profiles.user_id 
) 
WHERE (users.latitude > 38.904216788163 AND users.latitude < 42.501503211837) 
AND (users.longitude > -76.252301637251 AND users.longitude < -71.507178362749) 
AND (ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) < 200 AND users.sex = '1' AND users.seeking = '2' AND users.user_id != '1' AND users.account_status = '1' LIMIT 0, 10 

कभी इस प्रश्न का पागलपन बात नहीं, मूल रूप से मैं एक ही बिंदु users से चयन कर रहा हूँ टेबल जो मैं पहले अद्यतन किया गया था आईएनजी।

जब मैं एक के बाद इन 2 प्रश्नों एक निष्पादित इस समय मैं कर रहे हैं:

1st query: 0.0392 seconds 
2nd query: 1.5396 seconds 

यह पृष्ठ लोड समय में एक ध्यान देने योग्य विलंब होता है।

अब जब मैं ऑनलाइन उपयोगकर्ताओं के लिए एक अलग तालिका बनाया है और यह करने के लिए पहली क्वेरी को बदलें: बहुत तेजी से

1st query: 0.0411 seconds 
2nd query: 0.0008 seconds 

और पृष्ठ लोड:

UPDATE `online_users` 
SET `last_seen` = CURRENT_TIMESTAMP 
WHERE `user_id` = '$user_id' 

बार यह करने के लिए बदल गया है!

यह क्यों है? मेरा अनुमान है कि इसमें टेबल लॉकिंग के साथ कुछ करना है, लेकिन मुझे यह सुनिश्चित करने के लिए पर्याप्त जानकारी नहीं है या अधिक जानकारी पता है।

+0

क्या दूसरी क्वेरी अभी भी सही परिणाम लौटाती है? –

+1

यदि आप पहली बार बिना दूसरी क्वेरी चलाते हैं तो यह तेज़ है? यह किसी प्रकार का I/O मुद्दा हो सकता है - मैं MySQL आंतरिक पर नहीं हूं, लेकिन यह ऐसी चीज नहीं होनी चाहिए जो SQL समझ में अवरुद्ध हो रही है, इसके बाद यह एक ही लेनदेन में एक ही कनेक्शन पर है, इस मामले में इसे असामान्य परिवर्तन देखने की अनुमति है या परिवर्तन पहले ही किए जा चुके हैं। क्या आप इनो डीबी या माईसाम का उपयोग कर रहे हैं? –

+0

@ कैड रूक्स यदि मैं अकेली दूसरी क्वेरी चलाता हूं तो यह तेज़ है लेकिन केवल एक मिनट की राशि 0.0004 पर है। मैं माईसाम का उपयोग कर रहा हूँ। – TK123

उत्तर

1

क्योंकि SELECT * में last_seen MySQL क्वेरी या उप-क्वेरी को कैश नहीं कर सकता है। आप सभी क्षेत्रों की स्पष्ट गणना का प्रयास कर सकते हैं लेकिन last_seen। InnoDB मेज पर

(लेकिन एक अलग तालिका online_users ज्यादा समझ में आता है।)

+0

ने last_seen को छोड़कर सभी कॉलम नामों के लिए एक स्पष्ट कॉल के साथ कोशिश की और क्वेरी समय अभी भी वही लंबाई था। – TK123

+0

तो हम बुद्धिमान हैं; बस उसी तालिका को अद्यतन करना उस तालिका के _all_ कैश किए गए क्वेरी डेटा को हटा देता है। या प्रति टेबल थ्रेड आवंटन की तरह अस्पष्ट, और अद्यतन के डिस्क लिखने के पीछे। –

-4

क्वेरी MyISAM पर की तुलना में धीमी है। तालिका में और पंक्तियां क्वेरी को और धीमी बनाती हैं। तालिका पर गलत अनुक्रमण क्वेरी को और धीमा कर देता है, EXPLAIN कमांड के साथ जांचें।

0

SELECT क्वेरी मानते हुए आपके परीक्षण से कई बार चल रहा है, तो आप क्वेरी कैश के प्रभाव देख रहे हैं। तालिका पर कोई भी अद्यतन कैश को अमान्य कर देगा, और क्वेरी को फिर से निष्पादित करने के लिए मजबूर करेगा। एक अलग टेबल अपडेट करके, आप उन कैश प्रविष्टियों को क्लॉबर्डिंग से परहेज कर रहे हैं।

+0

यह समझ में आता है, लेकिन मेरे मामले में मेरे पास केवल एक बार निष्पादित क्वेरी है और यह अद्यतन क्वेरी के बाद है। – TK123

+0

ध्यान दें कि आप किसी अन्य आदेश को चलाने से पहले 'SET SESSION query_cache_type = OFF;' के साथ इसकी पुष्टि कर सकते हैं। (यह केवल मौजूदा कनेक्शन के लिए क्वेरी कैश को अक्षम कर देगा।) –

संबंधित मुद्दे

 संबंधित मुद्दे