SELECT foo की तुलना में SELECT * का परिमाण अधिक तेज़ क्यों होगा?


28

मान और हैश की तालिका पर विचार करें, जैसे:

+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| val        | char(9)  | NO   |     | NULL    |                |
| val_hashed | char(50) | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+

निम्न क्वेरी 0.00 सेकंड में समाप्त होती है:

SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;

हालाँकि, इस क्वेरी में 3 मिनट 17 सेकंड लगते हैं:

SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;

मैं देखता हूं कि जब क्वेरी प्रक्रिया सूची में चल रही है तो इसे स्थिति के रूप में दिखाता है Sorting result। स्थिति पूरी तरह से प्रतिलिपि प्रस्तुत करने योग्य है। ध्यान दें कि INSERTलगातार टेबल पर एक और प्रक्रिया प्रदर्शन संचालन है।

क्वेरी से अधिक विशिष्ट क्वेरी को चलाने में अधिक समय क्यों लगेगा *? मैंने हमेशा माना है कि *प्रदर्शन कारणों से प्रश्नों को विशेष रूप से टाला जाना चाहिए।


7
पहला कथन सबसे idपहली पंक्ति को खोजने के लिए प्राथमिक कुंजी सूचकांक का उपयोग करता है । दूसरे (पूर्ण अनुक्रमित) valकॉलम पर पूर्ण परिणाम को सॉर्ट करने की आवश्यकता है ।
a_horse_with_no_name

8
ORDER BY NUMBERवाक्य रचना काफी प्रवण त्रुटि है।
usr

2
अपनी पिछली टिप्पणी में SELECT *जोड़ते हुए, एक कॉलम इंडेक्स के साथ संयुक्त ORDER BYहै जो कि कॉलम को सॉर्ट किया जा रहा है - *एस से बचने का एक और कारण ...
lc।

@lc। तुम्हारा क्या मतलब है?
पेसियर

@ स्पेसर मेरा मतलब *स्पष्ट नहीं है। इसलिए यह कहना कि "मुझे सभी कॉलम दें और तीसरे नंबर से सॉर्ट करें" के बारे में निर्धारक के रूप में कहा जाता है "सुपरमार्केट में जाएं और मुझे बताएं कि आपने कितने ट्रैफिक लाइट पास किए हैं"
एलसी।

जवाबों:


33

वाक्यांश ORDER BY 1विभिन्न स्तंभों को संदर्भित करता है; पहले में यह होगा id, दूसरे में val। चूंकि idयह कुंजी है और इसे अनुक्रमित किया order byजाएगा और यह कार्य की एक तुच्छ राशि होगी। करने के लिए order by val, हालांकि, प्रणाली हर पंक्ति, द्वारा तरह पूरा तालिका को पुनः प्राप्त करना होगा val, तो उन पंक्तियों में से एक का चयन करें।

दोनों प्रश्नों को बदलें order by idऔर मुझे लगता है कि आपका निष्पादन समय लगभग समान होगा।


3
कभी-कभी पेचीदा सवाल वे होते हैं जो सिर्फ हमें घूर रहे होते हैं। धन्यवाद, माइकल!
डॉटनकोहेन

7

आपकी क्वेरी में प्रदर्शन अंतर एमजी द्वारा अच्छी तरह से समझाया गया है। मैं इसे संबोधित करने जा रहा हूं:

मैंने हमेशा माना है कि * प्रश्नों को विशेष रूप से प्रदर्शन कारणों से बचा जाना चाहिए।

select *अपने आप से कोई विशेष दंड नहीं लेता है, इसका दुरुपयोग होने पर समस्याग्रस्त है। सिंगल-टेबल क्वेरी में यह ठीक काम करता है। अब उस तालिका को 20 स्तंभों के साथ दूसरे में मिलाएं, और बाद में प्रत्येक स्तंभ के साथ 5 अन्य तालिकाओं में जोड़ दें। अब यह एक समस्या है। तो ऐसे लोग हैं जो बिना समझाए व्यापक, बैंड-एड "कभी एक्स नहीं करते हैं" सिखाते हैं।


3
SELECT *एकल-तालिका क्वेरी के लिए भी एक समस्या हो सकती है। उदाहरण के लिए, SELECT * FROM hashes ORDER BY val;संभवत: एक पूर्ण तालिका स्कैन करेंगे और फिर एक प्रकार जबकि SELECT val FROM hashes ORDER BY val;केवल एक पूर्ण सूचकांक स्कैन करेगा, और कोई भी प्रकार (मान नहीं है कि एक सूचकांक वैल पर मौजूद है)। इसलिए, कभी भी केवल उन परिणामों का चयन करने के लिए दर्द नहीं होता है जो हमें चाहिए।
ypercube y

मुझे लगता है कि आपने इसे देखा है? sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/…
मैक्स वेरनॉन

@ypercube, क्या तब भी होता है जब हमारा select(*)उपयोग केवल उप- उपयोग के रूप में किया जाता है ? चूँकि यह एक एम्बेडेड चयन है, इसलिए MySQL स्मार्ट नहीं होगा जो वास्तविक कॉलमों का पता लगाने में सक्षम हो?
पचेरियर

@Pacerier mysql ऑप्टिमाइज़र के पास "स्मार्टनेस" के विभिन्न स्तर हैं, जो आपके द्वारा उपयोग किए जा रहे संस्करण पर निर्भर करता है। Gerneal में, नेस्टेड सबक्वेरीज़ के बारे में यह बहुत गूंगा था, इसलिए जो भी आप उसकी मदद कर सकते थे, वह अच्छा था।
ypercube y

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