1

製品があるかなり大きなテーブルを持つMySQLデータベースがあります。それらのそれぞれには、この製品に属するカテゴリ ID がある独自の id フィールドと categoryId フィールドがあります。次のような特定のカテゴリから製品を引き出すクエリがあります。

SELECT * FROM products WHERE categoryId IN ( 1, 2, 3, 4, 5, 34, 6, 7, 8, 9, 10, 11, 12 )

もちろん、WHERE 句と ORDER BY ソートが来ますが、このことではありません。これらの製品が 250,000 で、1 日あたりの訪問数が 100,000 を超えるとしましょう。このような条件下で、slow_log テーブルには、生成時間が長いこれらのクエリの重みが登録されています。

与えられた問題を最適化する方法はありますか?

テーブル エンジンは MyISAM です。

4

1 に答える 1

2

この場合、categoryId のインデックスは役に立ちません。IN (...) クエリは、インデックス ルックアップの代わりにシーケンス スキャンを生成します。

最初にシステムを再設計して複数のカテゴリを選択しないようにし、それが適切でない場合はクエリ結果をキャッシュすることを検討します。

たとえば、ヘルパー テーブル items_category_groups(hash, item_id) を作成し、複数のカテゴリに対するクライアント クエリの後に、結合された ID をハッシュして、このテーブルを検索できます。見つからない場合は、高価なクエリを作成して、このテーブルに入力します。見つかった場合は、これらのテーブルを結合する安価なクエリを作成します。memcached などの他のキャッシュ ツールも機能します。

于 2010-03-09T10:31:25.977 に答える