3

MySQL 5.5 を使用しています。サブクエリを使用するクエリ (フルテキスト) があります。パフォーマンスと、ページネーションを使用しているという事実を支援するために、LIMIT を使用して結果の数を制限しています。

SELECT * 
FROM ( 
    SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL  (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id 
    FROM search_index
    WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id ) as search 
GROUP BY search.type, search.type_id DESC LIMIT 10; 

それに加えて、各検索クエリで可能な結果の総数 (50000) を返す必要があります。カウントを取得するために、私は以下を使用しています:

SELECT COUNT(*) FROM(
    SELECT * 
    FROM ( 
        SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL  (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id 
        FROM search_index
        WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id ) as search 
    GROUP BY search.type, search.type_id) as count;

しかし、これは私をやや不安にさせます。カウントクエリの説明は次のとおりです。

ここに画像の説明を入力

search_indexの全文索引contentです。 は、とsearch_index_no_ftを除くすべての列のインデックスです。に主キーがあります。contentidid

これを行うためのより良い方法、おそらくこれを最適化する方法はありますか? または、2 つのクエリ (カウントと検索) を 1 つに結合する方法はありますか?

4

1 に答える 1

0

SQL_CALC_FOUND_ROWS を使用しようとしましたか? それはこのように動作します:

SELECT SQL_CALC_FOUND_ROWS some_fields FROM table WHERE xxx LIMIT 10;
SELECT FOUND_ROWS();

唯一の制限は、最初のクエリの直後に 2 番目のクエリを実行する必要があることです。
mysql ドキュメントの詳細: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
同時クエリでどのように動作するかわからないため、確認する必要がありますこれ。

于 2012-04-25T07:00:57.580 に答える