0

このMySQLクエリの何が問題なのか誰か教えてもらえますか?

select distinct(a.productId)
  from product a
  left join product_keyword b
    on b.productId = a.productId
  left join keywords c
    on c.keywordId = b.keywordId
  where a.productName LIKE '%truck%' OR c.value LIKE '%truck%'
  limit 100;

実際には、3 つのテーブル ( productproduct_keywordおよびkeywords) を結合し、ユーザー入力に基づいて検索する必要があります。1 つの製品に複数のキーワードを指定でき、それを保存します (のキーワードからkeywordId) 。tableproduct_keyword

誰でも私を助けてもらえますか?

4

2 に答える 2

1

LIKE検索のプレフィックスでワイルドカードを使用すると%、MySQLは検索にインデックスを利用できません。代わりに、MySQLはすべての行をスキャンする必要があります。

MySQLが結合操作をより迅速に実行できるように、少なくとも結合列にインデックス(productIDとkeywordID)を設定する必要があります。ただし、結果セットが大きすぎる場合、MySQLはJOINのスキャンも実行します。

ほとんどの場合、MySQLは製品の各行をスキャンしてから、product_keywordへのJOINを実行し、次にキーワードへの結合を実行しています。次に、WHERE句に基づいて行を除外できるかどうかを確認します。100行を返すと、停止します。

于 2012-06-07T17:27:51.237 に答える
0

テーブルが大きい場合、これは非常にコストのかかるクエリになります。LIKEクエリで先頭のワイルドカードを使用すると、通常は非常に遅くなります。この種の検索機能が必要な場合は、データベースではなく、Luceneなどの外部で実行することをお勧めします。

于 2012-06-07T17:35:03.740 に答える