mysql कुछ रिकॉर्ड वाले विदेशी रिकॉर्ड के साथ रिकॉर्ड्स प्राप्त करता है - mysql

मेरे पास दो टेबल हैं

Parent:
+--+---------+
|id|   text  |
+--+---------+
| 1|  Blah   |
| 2|  Blah2  |
| 3|  Blah3  |
+--+---------+

Children
+--+---------+---------+
|id|parent_id| table_id|
+--+---------+---------+
| 1|   1     | 1       |
| 2|   1     | 3       |
| 3|   2     | 2       |
+--+---------+---------+

मैं 1 और 3 दोनों तालिका के साथ माता-पिता वाले बच्चों को खोजना चाहता हूं। वर्तमान में मैं निम्नलिखित क्वेरी का उपयोग कर रहा हूं

SELECT *
FROM  Parent
WHERE id
IN (
SELECT parent_id
FROM Children
WHERE table_id = 1
)
AND id
IN (
SELECT parent_id
FROM Children
WHERE table_id = 3
)

जैसा कि मेरे पास हजारों रिकॉर्ड हैं, यह क्वेरी बहुत धीमी गति से चलती है।

क्या इसे निष्पादित करने के लिए वैकल्पिक तेज क्वेरी है?

उत्तर:

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

आप mysql दे सकते हैं व्याख्या आप के लिए इसकी निष्पादन योजना: जाँच करें यह अध्याय मैनुअल में।वहां से, आप अपनी क्वेरी को गति के लिए अनुकूलित कर सकते हैं। उस के लिए अलग-अलग दृष्टिकोण हैं, यह एक व्यापक क्षेत्र है - लेकिन सामान्य तौर पर, यह संख्या और शामिल किए गए और आंतरिक प्रश्नों की चौड़ाई को कम करने के लिए एक अच्छी शुरुआत है।


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

इसे करने के कई तरीके हैं, और उचित अनुक्रमण के साथ एक तरीका इसे बहुत तेज़ बना देगा

select p.* from parent p
join children c on c.parent_id = p.id
where c.table_id = 1
and exists (
select 1 from children c1
where c1.parent_id = c.parent_id
and c1.table_id = 3
);

जिन इंडेक्स को जोड़ा जा सकता है

alter table parent add index id_idx(id);
alter table children add index parent_idx(parent_id);
alter table children add index table_id_idx(table_id);

उत्तर № 3 के लिए -1
SELECT c.parent_id, p.text,
SUM(CASE WHEN c.table_id=1 THEN 1 ELSE 0 END) as t_1,
SUM(CASE WHEN c.table_id=3 THEN 1 ELSE 0 END) as t_3
FROM  Children c
LEFT JOIN Parent p
ON c.parent_id = p.id
WHERE c.table_id IN ( 1, 3)
GROUP BY c.parent_id
HAVING t_1>0 AND t_3>0

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