Mysql - mysql में 4 टेबल या उससे अधिक में शामिल होने के लिए तेज़ क्वेरी

मैंने एकाधिक से चयन करने के इस प्रारूप को देखाकई स्थितियों वाले टेबल कहीं और मैं इसे कई सालों से कार्यान्वित कर रहा हूं। मैं क्या जानना चाहता हूं कि अगर कोई तरीका है तो हम इसे तेज कर सकते हैं। क्वेरी की पृष्ठभूमि: मैं छात्र तालिका में पोस्ट की गई नौकरी के लिए संदेश तालिका बी / डब्ल्यू छात्र और शिक्षक से संदेशों का चयन कर रहा हूं। ट्यूटर की जानकारी tutorinfo तालिका में संग्रहीत है और studentinfo studentinfo तालिका में संग्रहीत है।

कृपया यह भी बताएं कि यह किस तरह का जुड़ाव है।किसी ने मुझे बताया कि यह एक क्रॉस शामिल है लेकिन मुझे यकीन नहीं है। मुझे हाल ही में शामिल होने के बारे में पता नहीं था लेकिन कभी नहीं करना था। इस प्रारूप ने मुझे काफी समय से सेवा दी है। मुझे यकीन नहीं है कि शामिल स्वरूपण का उपयोग करने से यह बेहतर होगा, अगर कोई बेहतर हो।

वर्तमान क्वेरी यहां है ::

SELECT
messages.* ,
tutorinfo.id as tutor_id,
jobs.student_id as student_id, jobs.job_title
from messages, tutorinfo, studentinfo, jobs where
messages.job_id= jobs.id and jobs.student_id = "3" and messages.thread_id = "2" and        messages.tutor_id = tutorinfo.id and messages.job_id = jobs.id and studentinfo.id=jobs.student_id

उत्तर:

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

यहां आपका चयन कथन अधिक लिखा गया हैआधुनिक शैली। इस शैली में आप जुड़ सकते हैं (ध्यान दें कि वे सभी आंतरिक शामिल हैं)। आप बता सकते हैं कि वे आंतरिक जुड़ते हैं (हमारे दोनों प्रश्नों में) क्योंकि कॉलम पर शामिल होने के बराबर शामिल होते हैं। क्रॉस में शामिल होने या बाहरी जुड़ने के आपके तरीके में आपको विशेष स्वरूपण की आवश्यकता होती है (केवल एक के बजाय =), "जुड़ें" प्रारूप के साथ आप विशेष वाक्यविन्यास का उपयोग करते हैं।

SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
join jobs j on m.job_id = j.job_id
join studentinfo s on j.student_id = s.id
join tutorinfo t on m.tutor_id = t.id
where j.student_id = "3" and m.thread_id = "2"

एक बात स्पष्ट है - studentinfo का उपयोग नहीं किया जाता है, आप इसे बाहर ले जा सकते हैं। इसके अलावा सभी कॉलम में इंडेक्स जोड़ना जो जुड़ने के रूप में उपयोग किया जाता है, मैं अनुकूलन के तरीके में ज्यादा नहीं देखता हूं।

SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
join jobs j on m.job_id = j.job_id
join tutorinfo t on m.tutor_id = t.id
where j.student_id = "3" and m.thread_id = "2"

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

MySQL जॉइन का प्रयोग करें

यहां छवि विवरण दर्ज करें

    SELECT
jobs.`id` AS jobs_id,
jobs.`job_title` AS jobs_job_title,
messages.`id` AS messages_id,
messages.`job_id` AS messages_job_id,
messages.`thread_id` AS messages_thread_id,
messages.`tutor_id` AS messages_tutor_id,
messages.`student_id` AS messages_student_id,
tutorinfo.`id` AS tutorinfo_id
FROM
`messages` messages INNER JOIN `tutorinfo` tutorinfo ON messages.`tutor_id` = tutorinfo.`id`
INNER JOIN `jobs` jobs ON messages.`job_id` = jobs.`id`  WHERE jobs.student_id = "3" AND messages.thread_id = "2"

इन सामानों पर भी नज़र डालें

एसक्यूएल का एक विज़ुअल स्पष्टीकरण जुड़ता है

दृश्य-प्रतिनिधित्व के- एसक्यूएल-में शामिल


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

यह @ होगन के उत्तर के पूरक के लिए एक टिप्पणी होगी, लेकिन मैं अलग से पोस्ट कर रहा हूं। MySQL में JOIN, INNER JOIN तथा CROSS JOIN सभी सिंथेटिक समकक्ष हैं। , तथा INNER JOIN हालांकि, शामिल होने की स्थिति की अनुपस्थिति में अर्थात् समकक्ष हैं , कम प्राथमिकता है।

मूल क्वेरी में शामिल स्थितियों में हैजहां खंड में रखा गया है। MySQL क्वेरी ऑप्टिमाइज़र शायद वर्तमान क्वेरी के लिए एक अनुकूलित क्वेरी योजना के साथ आता है और उपयोग करके उत्पाद में क्रॉस जॉइन और फ़िल्टरिंग से बचाता है INNER JOINS एक अनुकूलित आदेश में।हालांकि, थोड़ा सा रिकॉर्ड करके आप शामिल शर्तों को स्पष्ट कर सकते हैं, पढ़ने के आदेश को मजबूर कर सकते हैं और क्वेरी ऑप्टिमाइज़र को जो काम करना है उसे कम कर सकते हैं। शायद यह लचीला प्रदर्शन लाभ है। आपको देखने के लिए प्रोफाइल करना होगा।

SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
STRAIGHT_JOIN jobs j on m.job_id = j.job_id and j.student_id = "3"
STRAIGHT_JOIN tutorinfo t on m.tutor_id = t.id
where m.thread_id = "2"

STRAIGHT_JOIN के समान है JOIN लेकिन बाईं ओर दाईं ओर पढ़ा जाता है। MySQL से प्रलेखन:

जॉइन ऑप्टिमाइज़र उस ऑर्डर की गणना करता है जिसमें ऑर्डर होता हैटेबल होना चाहिए में शामिल हो गए। तालिका को बाएं जॉइन या STRAIGHT_JOIN द्वारा मजबूर आदेश पढ़ा जाता है जुड़ने वाले ऑप्टिमाइज़र को इसके काम को और अधिक तेज़ी से करने में मदद करता है, क्योंकि वहां जांच करने के लिए कम टेबल क्रमपरिवर्तन हैं


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