Отговорът на Джейсън е точен. Освен това бих се опитал да използвам по-модерния синтаксис за присъединяване на ANSI, за да сваля натоварването от клаузата WHERE, така че облекчете объркването там:
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 таблици), можете да запазите окончателното копие на вашите данни в правилно нормализирани таблици InnoDB, с допълнителна таблица MyISAM съдържаща само стръв за търсене с оголени и стебли.
Ако нищо от това не е добро... е, предполагам, че бих се върнал към UNIONing, който споменахте, заедно с филтър на ниво приложение за премахване на дублиращи се идентификатори.