ジェイソンの答えは的確です。さらに、最新の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の結果を投稿できますか?おそらく、フルテキストインデックスの一方または両方が使用されていません。クエリオプティマイザーが、インデックスに直接移動する代わりに、最初のフルテキストクエリと一致しなかった行を「入力」しようとするなどして、2番目のフルテキストインデックスを使用できないことは確かに想像できます。
>通常、2つの列を組み合わせて全文索引を作成する場合は、両方の列に1つの索引を作成します。いずれにせよ、これははるかに高速です。ただし、タイトルと説明を同じテーブルに配置する必要があることを意味します。これはそれほど難しいことではないかもしれません。フルテキストはMyISAMテーブルでのみ機能するため(通常、MyISAMテーブルに正規データは必要ありません)、追加のMyISAMテーブルを使用して、データの最終的なコピーを適切に正規化されたInnoDBテーブルに保持できます。ストリップされてステム化された検索ベイトのみが含まれています。
それでも問題がなければ...まあ、重複したIDを削除するためのアプリケーションレベルのフィルターと組み合わせて、あなたが言及したUNIONに戻ると思います。