का उपयोग करते समय मैं अपने SQL-code में "ORDER BY" -statements के उपयोग के कारण कुछ प्रमुख प्रदर्शन मुद्दों को मार रहा हूं।MySQL इंडेक्स का उपयोग नहीं कर रहा है ("फाइलों का उपयोग करना") ORDER BY
सब कुछ ठीक है जब तक मैं SQL में ORDER BY-statement का उपयोग नहीं कर रहा हूं। हालांकि, एक बार जब मैं ORDER BY: एसक्यूएल कोड में प्रस्तुत करता हूं तो सही इंडेक्सिंग की कमी के कारण सब कुछ नाटकीय रूप से धीमा हो जाता है। कोई यह मान लेगा कि यह तय करना मामूली होगा, लेकिन फोरम चर्चाओं से निर्णय लेना आदि यह एक आम मुद्दा है कि मुझे अभी तक इस प्रश्न का एक निश्चित और संक्षिप्त उत्तर नहीं मिला है।
प्रश्न: को देखते हुए निम्न तालिका ...
CREATE TABLE values_table ( id int(11) NOT NULL auto_increment, ... value1 int(10) unsigned NOT NULL default '0', value2 int(11) NOT NULL default '0', PRIMARY KEY (id), KEY value1 (value1), KEY value2 (value2), ) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8;
... कैसे मैं अनुक्रमित है कि जब एक मान 1 -range के लिए तालिका में जानना चाहते हैं, जबकि मूल्य के वर्गीकरण का उपयोग किया जाएगा बना सकता हूँ मूल्य 2?
वर्तमान में, ऑर्डर द्वारा ऑर्डर द्वारा उपयोग नहीं किया जा रहा है, तो वर्तमान में लांचिंग ठीक है।
निम्नलिखित व्याख्या क्वेरी के उत्पादन देखें:
OK, when NOT using ORDER BY: EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
However, when using ORDER BY I get "Using filesort": EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 order by this_.value2 asc limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where; Using filesort | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
तालिका सामग्री के बारे में कुछ अतिरिक्त जानकारी:
SELECT MIN(value1), MAX(value1) FROM values_table; +---------------+---------------+ | MIN(value1) | MAX(value2) | +---------------+---------------+ | 0 | 4294967295 | +---------------+---------------+ ... SELECT MIN(value2), MAX(value2) FROM values_table; +---------------+---------------+ | MIN(value2) | MAX(value2) | +---------------+---------------+ | 1 | 953359 | +---------------+---------------+
कृपया मुझे पता कोई और जानकारी सवाल का जवाब देने की जरूरत है, तो चलो ।
बहुत पहले से धन्यवाद!
# अद्यतन 1: एक नई समग्र सूचकांक जोड़ना (ALTER तालिका values_table सूचकांक (मान 1, मान 2 ADD);) समस्या का समाधान नहीं है। ऐसी इंडेक्स जोड़ने के बाद भी आपको "फाइलों का उपयोग करना" मिल जाएगा।
अद्यतन # 2: एक बाधा है कि मैं अपने प्रश्न में उल्लेख नहीं था कि मैं नहीं बल्कि इस्तेमाल किया एसक्यूएल प्रश्नों को बदलने से तालिका की संरचना को बदल देंगे (आदि, कहते हैं जोड़ने अनुक्रमित) है। एसक्यूएल प्रश्न हाइबरनेट का उपयोग करके स्वतः उत्पन्न होते हैं, इसलिए उन लोगों को अधिक या कम तय करें।
मुझे लगता है कि आपका मतलब मूल्य 1, मूल्य 2 आपके अपडेट में है, हां? – paxdiablo
कोई बात नहीं, यह वैल्यू 1 के मूल्य के बारे में @ Quassnoi के स्पष्टीकरण के कारण वैसे भी काम नहीं करेगा। यह मूल्य 1 के एक मूल्य के लिए काम करता था लेकिन मैंने इस सवाल को पर्याप्त रूप से नहीं पढ़ा। शुभकामनाएँ। – paxdiablo
क्या आप सीधे अपनी क्वेरी में फ़ील्ड का उपयोग करते हैं या आप फ़ंक्शंस का उपयोग कर रहे हैं? एक टाइमस्टैम्प फ़ील्ड और WEEK (टाइमस्टैम्प) की तरह। –