0

現在MySQLで実行している非常に具体的なクエリがあります

私のテーブル構造は次のとおりです。

id : INT, primary KeY, AUTO_INCREMENT
occupationID : INT
alias : VARCHAR(255)

次に、私は

SELECT occupationID, (MATCH(alias) AGAINST ('Web Developer' IN NATURAL LANGUAGE MODE) / count(*)) as score FROM aliases group by occupationID order by score DESC LIMIT 0,2;

このクエリは、すべての ROW で検索を実行し、フル スキャンを実行して、一致を出現回数で除算します。このようにして、すべての行で平均スコアを取得し、必要な精度を得ることができました。

これは非常に遅く (20 秒)、50k のレコード テーブルがあります。(私は驚かない。MySQL フルテキストは非常に遅い...)。

Sphinx では、次のクエリでインデックスを作成することを考えていました。

select id,occupationID,alias, (SELECT count(*) from aliases AS A WHERE B.occupationID=A.occupationID) as nb   from aliases AS B 

そして、

$sphinx->setSelect("@id, sum(@weight)/nb as score");
$sphinx->setGroupBy("occupationID", GROUP_BY_ATTR, "score DESC");

$sphinx->query("Web Developer");

私はこれを正しく行っていますか?

4

1 に答える 1

1

多くの場合。私が見つけた唯一の奇妙な点は、元のmysqlにあり、職業IDでグループ化されています。ただし、インデックスを構築する際に id を結合します。つまり、カウントは、サンプルの職業 ID ではなく、同じ id を持つ数値になります。

また、スフィンクスで sum(@weight) が機能するかどうかもわかりません-理論的には機能するはずですが、奇妙な制限がいくつかあるため、テストしないと確認できません。

于 2012-09-22T14:36:36.087 に答える