mysql डेटा भेजने में बहुत अधिक समय ले रहा है


9

मेरे पास लाखों रिकॉर्ड (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 पर चल रहा है।


SELECTवापसी कितनी पंक्तियों में होती है ?
hjpotter92

1591 rows in set (16.48 sec)मैंने फिर से क्वेरी चलाई, यही कारण है कि अवधि अलग है। अब 16 सेकंड (!!)
rlcabral

उपयोग करने के बजाय * स्तंभों का उपयोग करने का प्रयास करें और फिर देखें कि इससे क्या फर्क पड़ता है
मुहम्मद रहल

नहीं। एक ही परिणाम।
rlcabral

आईडी कॉलम को एक साधारण प्राथमिक सूचकांक बनाने की कोशिश करें। चूंकि आईडी एक अद्वितीय फ़ील्ड होनी चाहिए, इसलिए आपको इसके साथ जटिल अनुक्रमणिका बनाने की आवश्यकता नहीं है। यह एक lightspeed की तरह प्राथमिक कुंजी द्वारा तेजी से अपनी खोज करना चाहिए।
अलेक्जेंडर प्रवीण

जवाबों:


1

जो कोई भी इस सवाल पर ठोकर खाता है और सोचता है, यहां तक ​​कि रैम के उन्नयन के बिना, डेटा भेजना इतना अधिक समय क्यों ले रहा था। ऐसा इसलिए है क्योंकि डेटा भेजना वास्तव में भेजे जाने वाले डेटा की खोज का समय शामिल है।

https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

थ्रेड एक सेलेक्ट स्टेटमेंट के लिए पंक्तियों को पढ़ रहा है और प्रोसेस कर रहा है, और क्लाइंट को डेटा भेज रहा है। क्योंकि इस स्थिति के दौरान होने वाले ऑपरेशन बड़ी मात्रा में डिस्क एक्सेस (रीड्स) करते हैं, यह अक्सर किसी दिए गए क्वेरी के जीवनकाल में सबसे लंबे समय तक चलने वाला राज्य होता है।


-2

ऑप्टिमाइज़ टेबल टैब्लेम का उपयोग करके तालिका को ऑप्टिमाइज़ करने का प्रयास करें और स्थिति की जांच करें।

बड़ा परिवर्तन करने की आवश्यकता है:

Alter table tablename engine = 'INNODB'

यह आपकी बहुत मदद करेगा और संभवतः तालिका में एक प्राथमिक कुंजी होनी चाहिए लेकिन आपने प्राथमिक कुंजी के रूप में तीन कॉलम जोड़े हैं।


-3

आईडी के लिए अलग इंडेक्स बनाएं:

परिवर्तन तालिका विवरण कुंजी d1 (आईडी) जोड़ें;

इस सूचकांक को प्रभावी बनाने के लिए, MySQL को पुनः आरंभ करें या

तालिका विवरण का विश्लेषण;

यदि संभव हो, तो आप लेन-देन समर्थन और अन्य लाभों के लिए डेटाबेस को InnoDB में भी बदल सकते हैं।


यह कैसे मदद करेगा?
कॉलिन टी हार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.