जेसन का जवाब हाजिर है। इसके अतिरिक्त मैं WHERE क्लॉज को लोड करने के लिए अधिक आधुनिक ANSI सिंटैक्स में शामिल होने का उपयोग करने की कोशिश करूंगा ताकि वहां भ्रम को दूर किया जा सके:
SELECT o.id
FROM programs o
JOIN titles_programs t ON t.object_id=o.id
JOIN descriptions_programs d ON d.object_id=o.id
WHERE MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE) AND d.current=1
OR MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE) AND t.current=1
यह अनजाने में क्रॉस-जॉइन को रोक देगा जिससे एक कॉम्बीनेटरियल विस्फोट हो सकता है; मुझे उम्मीद है कि यह उचित समय में काम करेगा जब तक कि डेटाबेस वास्तव में बहुत बड़ा न हो।
यदि नहीं, तो क्या आप उपरोक्त में से एक EXPLAIN SELECT के परिणाम पोस्ट कर सकते हैं? संभावित रूप से एक या दोनों पूर्ण टेक्स्ट इंडेक्स का उपयोग नहीं किया जा रहा है। मैं निश्चित रूप से कल्पना कर सकता हूं कि क्वेरी ऑप्टिमाइज़र दूसरी पूर्ण टेक्स्ट इंडेक्स का उपयोग करने में विफल रहा है, कुछ ऐसा करके जो पंक्तियों को 'भरने' की कोशिश कर रहा है जो सीधे इंडेक्स, या कुछ पर जाने के बजाय पहली पूर्ण टेक्स्ट क्वेरी से मेल नहीं खाता है।
आम तौर पर जब आप संयोजन में दो स्तंभों पर पूर्ण-पाठ अनुक्रमणिका चाहते हैं, तो आप दोनों स्तंभों पर एक अनुक्रमणिका बनाते हैं। यह किसी भी मामले में बहुत तेज होगा। हालांकि इसका मतलब यह होगा कि आपको एक ही तालिका में शीर्षक और विवरण रखना होगा। यह इतनी कठिनाई नहीं हो सकती है:चूंकि फुलटेक्स्ट केवल MyISAM तालिकाओं पर काम करता है (और आप आमतौर पर MyISAM तालिकाओं में अपना विहित डेटा नहीं चाहते हैं) आप एक अतिरिक्त MyISAM तालिका के साथ अपने डेटा की निश्चित प्रति को ठीक से सामान्यीकृत InnoDB तालिकाओं में रख सकते हैं। जिसमें केवल छीन लिया और तना हुआ खोज-चारा होता है।
अगर इनमें से कोई भी अच्छा नहीं है... ठीक है, मुझे लगता है कि मैं आपके द्वारा उल्लिखित यूनियनिंग पर वापस जाऊंगा, साथ ही डुप्लिकेट आईडी को हटाने के लिए एप्लिकेशन-स्तरीय फ़िल्टर के साथ।