2012-04-25 4 views
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; 

これは私にやや不安です。ここではカウントクエリのために説明します:

enter image description here

search_indexcontent上のフルテキストインデックスです。 search_index_no_ftは、contentおよびidを除くすべての列のインデックスです。 idに主キーがあります。

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

+0

実際に一致する数が正確に必要ですか?グーグルが見積もりだけを表示する理由がある必要があります... – piotrm

+0

ほとんどの場合、たとえば、ユーザーリストのフィルタリングや検索などの場合に有効なページ番号を生成するには、正確な一致数が必要です。データの量が非常に多く、ユーザーがとにかくすべてを通過することはないので、私は見積もりに満足しています。だから、私のユースケースには完全一致が必要です。 – F21

+0

一部のユーザーは、もしあなたがそれをやらせるならば、それらをすべてやってみようとするでしょう。制限に基づくページネーションのウェブサイトで最も高いオフセットを乱用するのは、一般的なDOS攻撃です。 – piotrm

答えて

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
同時クエリでどのように動作するかわからないので、これを確認する必要があります。

+0

申し訳ありませんが、私は私の疑問に致命的な間違いを犯したことに気付きました。 LIMITで設定した検索の可能な行の総数と行のサブセットを返す必要があります。私が望む効果は検索エンジンに似ています.1000件の検索結果と10件の検索結果が表示されます(ユーザーがどのページにいるかによって異なります)。 – F21

関連する問題