MySQL क्वेरी में बहुत धीमे हो गए - mysql, sql

मैं दो टेबल में शामिल होने के लिए इस SQL ​​क्वेरी का उपयोग कर रहा हूं और 10 की सीमा के साथ भी 10 सेकंड लगते हैं। मैंने जांच की है कि तालिकाएं अनुक्रमित हैं या नहीं, इसलिए वे विचारों से बाहर हैं। किसी भी मदद की सराहना की जाएगी।

SELECT * FROM client_registration_request
LEFT JOIN customers ON (client_registration_request.customer_reference=customers.reference)
LEFT JOIN region_info ON ( customers.country = region_info.id )
WHERE client_registration_request.client = 23
LIMIT 10

व्याख्या के चयन से परिणाम यहां दिए गए हैं

चयन की व्याख्या करें

client_registration_request अनुक्रमणिका

client_registration_request अनुक्रमणिका

ग्राहक सूचकांक

ग्राहक सूचकांक

और region_info सूचकांक और region_info सूचकांक

उत्तर:

उत्तर № 1 के लिए 1

हमेशा सुनिश्चित करें कि आप अपने लिए उपयोग कर रहे फ़ील्ड JOIN - स्थितियां अनुक्रमित हैं:

ALTER TABLE `client_registration_request` ADD INDEX `customer_reference` (`customer_reference`);
ALTER TABLE `customers` ADD INDEX `reference` (`reference`);

.. और इसी तरह।

अद्यतन करें: तुंहारे EXPLAIN दिखाता है कि आपकी अनुक्रमित कुंजी customers टेबल का उपयोग नहीं किया जाता है। तो उन्हें फिर से अनुक्रमित करने का प्रयास करें:

ALTER TABLE `customers` ADD INDEX `reference` (`reference`);
ALTER TABLE `customers` ADD INDEX `country` (`country`);

जवाब के लिए 0 № 2

जिस तरह से आपने क्वेरी लिखी है, दो बाएं जुड़ने के बाद परिणामों को सीमित और फ़िल्टर कर रहा है, यही कारण है कि यह क्वेरी करने के लिए एक ही समय ले रहा है।

इसे तेज़ी से बनाने के लिए आपको जितनी जल्दी हो सके इसे सीमित और फ़िल्टर करना होगा, आपके मामले में आप किसी भी शामिल होने से पहले इसे सीमित और फ़िल्टर करना चाहते हैं।

चूंकि आप बाएं जॉइन का उपयोग कर रहे हैं, आप पहली तालिका को सीमित और फ़िल्टर कर सकते हैं और फिर भी वही परिणाम प्राप्त कर सकते हैं। इसे इस्तेमाल करे:

SELECT * FROM
(SELECT * FROM client_registration_request WHERE client_registration_request.client = 23 LIMIT 10) client_registration_request_TMP
LEFT JOIN customers ON (client_registration_request_TMP.customer_reference=customers.reference)
LEFT JOIN region_info ON ( customers.country = region_info.id )

जवाब के लिए 0 № 3

टेबल उपनाम का उपयोग करके आपकी क्वेरी यहां दी गई है (इसलिए मुझे इसका पालन करना आसान लगता है):

SELECT *
FROM client_registration_request crr LEFT JOIN
customers c
ON crr.customer_reference = c.reference LEFT JOIN
region_info r
ON c.country = r.id
WHERE crr.client = 23
LIMIT 10

सबसे महत्वपूर्ण सूचकांक चालू है client_registration_request(client)। लेकिन, मैं दूसरे को शामिल करूंगा join इसमें कॉलम तो, पहली सूचकांक है client_registration_request(client, reference, country)। आप इसे इस प्रकार बना सकते हैं:

create index idx_client_registration_request_3 on client_registration_request(client, reference, country);

मुझे लगता है कि अन्य तालिकाओं में कुंजी पहले से ही प्राथमिक कुंजी या अनुक्रमित हैं। यदि नहीं, तो आपको भी उन पर इंडेक्स बनाना चाहिए customer(reference) तथा region_info(country)

इसका उपयोग करना LIMIT बिना ORDER BY संदिग्ध है जब आप क्वेरी चलाते हैं तो आपको मेल खाने वाली पंक्तियों का मनमाना सेट मिल जाएगा - आप गारंटी नहीं दे सकते कि दो रन एक ही सेट को वापस कर देंगे।


संबंधित सवाल
सबसे लोकप्रिय