3

約350万点の商品表を持っています。テーブルには、titleという名前の列にフルテキストインデックスがあります。

次のクエリの例は最大4秒かかりますが、これは完全に受け入れられず、最適化する方法を検討しています...アイデア/アドバイスをいただければ幸いです。

基本的に; どの列にインデックスを付ける必要がありますか、非常に多くの列を個別に引き出す必要がありますか、それともすべての列を引き出す方が速いですか(合計23個あります)など。

クエリの例:

SELECT PRid, title, Artist, author, actors, imageURL, prodcat, lowprice,
highprice, prodcatID, description from products where
((MATCH(title) AGAINST ('+blue +top' IN BOOLEAN MODE))) order by
userrating desc limit 500 
4

2 に答える 2

2

最初の訪問先は、常にEXPLAINMySQL が何をしているかを確認することです。一致スコア以外でのソートはおそらく役に立たないのではないかと思います.mysqlがユーザーレーティングのインデックスをフルテキストインデックスと同時にソートに使用できるとは思いません.

前回 MySQL の全文検索を使用したとき (確かに数年前)、100 万行程度を超えると十分に高速ではないことがわかりました。cloudsearch、elasticsearch、solr、sphinx などの全文検索エンジンを検討することをお勧めします。

于 2012-05-16T07:46:34.450 に答える
1

「タイトル」のユニークな組み合わせは何通りありますか? そのデータを、メイン データ テーブルの外部キーを使用してルックアップ テーブルに入れると、価値があることがわかる場合があります。

次に、データのクエリを実行するときに、2 つのテーブルを結合し、小さい方のテーブルにフィルターを適用します。これにより、適用にかかる時間が短縮されます。次に、数値フィールドで結合が行われ、メイン データ テーブルでインデックスを作成できます。

これは、350 万行でテキスト フィルターを実行するよりもはるかに高速です。そのデータ内に多くの重複があると仮定すると、ルックアップ テーブルはこのサイズの一部になる可能性があります。

また、テキスト フィールドの代わりに数値フィールドがある場合、行が小さくなるため、データ全体のサイズが小さくなるため、メイン データの読み取りが高速になることもわかります。

すべてのテキスト ベースのデータをルックアップに取得すると、すべてがさらに高速になります。メイン データ テーブルが動的ではなく固定形式になる可能性があるためです。つまり、テーブル内でデータを検索するときにインデックスがより効率的になります。

それが役立つことを願っています!

デイブ

于 2012-05-16T07:33:38.310 に答える