Jasonova odpověď je na místě. Kromě toho bych se pokusil použít modernější syntaxi spojení ANSI, abych odstranil zátěž z klauzule WHERE, takže tam není zmatek:
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
Tím se zastaví neúmyslné křížové spojení způsobující kombinatorickou explozi; Očekával bych, že bude fungovat v rozumném čase, pokud databáze nebude opravdu obrovská.
Pokud ne, můžete zveřejnit výsledky EXPLAIN SELECT výše? Pravděpodobně se nepoužívá jeden nebo oba fulltextové indexy. Určitě bych si dokázal představit, že optimalizátor dotazů nedokáže použít druhý fulltextový index tím, že udělá něco jako pokus „vyplnit“ řádky, které neodpovídají prvnímu fulltextovému dotazu, místo toho, aby šel rovnou do indexu nebo tak něco.
Normálně, když chcete fulltextově indexovat přes dva sloupce v kombinaci, vytvoříte jeden index přes oba sloupce. To by bylo v každém případě mnohem rychlejší. To by však znamenalo, že musíte názvy a popisy umístit do stejné tabulky. To nemusí být takový problém:protože fulltext funguje pouze na tabulkách MyISAM (a obvykle nechcete svá kanonická data v tabulkách MyISAM), můžete si ponechat definitivní kopii svých dat ve správně normalizovaných tabulkách InnoDB s další tabulkou MyISAM. obsahující pouze svlečenou a odstopkovanou vyhledávací návnadu.
Pokud nic z toho není k ničemu... no, myslím, že bych se vrátil k UNIONingu, které jste zmínil, spolu s filtrem na úrovni aplikace pro odstranění duplicitních ID.