मेरे पास लाखों रिकॉर्ड (14,000,000) के साथ एक सरल तालिका है और एक साधारण क्वेरी के लिए यह "डेटा भेजने" में बहुत अधिक समय खर्च कर रहा है।
टेबल
CREATE TABLE IF NOT EXISTS details (
id int(11) NOT NULL,
date date NOT NULL,
time int(2) NOT NULL,
minutes_online decimal(5,0) NOT NULL,
minutes_playing decimal(5,0) NOT NULL,
minutes_chatting decimal(5,0) NOT NULL,
minutes_away decimal(5,0) NOT NULL
PRIMARY KEY (id,date,time)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
सरल क्वेरी
mysql> SELECT * FROM details WHERE id = 3014595;
समझाना
mysql> EXPLAIN SELECT * FROM details WHERE id = 3014595;
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | details | ref | PRIMARY | PRIMARY | 4 | const | 1482 | |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
क्वेरी के लिए प्रोफ़ाइल
mysql> SHOW PROFILE FOR QUERY 1;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000024 |
| checking query cache for query | 0.000078 |
| checking permissions | 0.000014 |
| Opening tables | 0.000126 |
| System lock | 0.000011 |
| Table lock | 0.000030 |
| init | 0.000027 |
| optimizing | 0.000117 |
| statistics | 0.040077 |
| preparing | 0.000029 |
| executing | 0.000006 |
| Sending data | 7.536960 |
| end | 0.000013 |
| query end | 0.000004 |
| freeing items | 0.000037 |
| storing result in query cache | 0.000006 |
| logging slow query | 0.000003 |
| cleaning up | 0.000006 |
+--------------------------------+----------+
जैसा कि आप देख सकते हैं, SELECT
बयान ने सूचकांक का उपयोग किया और केवल 1482 पंक्तियों को पढ़ा। फिर भी, क्वेरी ने डेटा भेजने में 7.536960 सेकंड खर्च किए। यह क्वेरी की तरह है जिसे बहुत अधिक पंक्तियों की आवश्यकता है।
यह एक साधारण क्वेरी है, जिसमें केवल 7 फ़ील्ड्स (पंक्ति एवी 59 बाइट्स) और कोई फैंसी फ़ंक्शन नहीं है। किसी भी विचार यह क्या कारण हो सकता है?
नोट: आईडी यूजर आईडी है। प्रत्येक उपयोगकर्ता के पास हर दिन के प्रत्येक घंटे के लिए कम से कम एक प्रविष्टि हो सकती है। इसलिए, आईडी अद्वितीय नहीं है।
संपादित करें: मेरे पास समान संरचना और बहुत अधिक पंक्तियों (34 मिलियन) के साथ एक और तालिका है। यदि मैं इस बड़ी तालिका पर समान क्वेरी चलाता हूं, तो यह 1 सेकंड से भी कम समय में परिणाम देता है।
अंतर केवल इतना है कि बड़ी तालिका में छोटी तालिका के रूप में कई प्रश्न नहीं मिलते हैं।
- क्या यह संभव है कि प्रश्नों की संख्या प्रक्रिया को धीमा कर रही है? MySQL कैश चालू है। मैंने कई प्रश्नों की संख्या को कम करने के लिए प्रश्नों को कैशिंग भी किया है।
- क्या यह संभव है कि वह फ़ाइल जहाँ तालिका सहेजी गई है दूषित है या कुछ और?
अद्यतन समस्या को वेब टियर से डेटा टियर को अलग करके हल किया गया था। डेटा टियर को रैम पर अपग्रेड भी मिला है और यह r10 पर चल रहा है।
1591 rows in set (16.48 sec)
मैंने फिर से क्वेरी चलाई, यही कारण है कि अवधि अलग है। अब 16 सेकंड (!!)
SELECT
वापसी कितनी पंक्तियों में होती है ?