1

次のテーブル構造を使用します。

アイテム (~20,000 レコード)

  • item_id

プロパティ (~30 レコード)

  • property_id

Item_properties (~40,000 レコード)

  • ID
  • property_id
  • item_id

ユーザーは、itemsテーブル自体のフィールドの数によってアイテムをフィルター処理することを選択できます。またproperties、アイテムに必要な任意の数を選択することもできます。検索では、1 つのプロパティだけでなく、すべてのプロパティを持つアイテムを選択する必要があります。現在使用しているフォーマット

SELECT item.field...
FROM items
INNER JOIN item_properties AS ip1 ON ip1.item_id=item.item_id and ip1.property_id=3
INNER JOIN item_properties AS ip2 ON ip2.item_id=item.item_id and ip2.property_id=4
INNER JOIN item_properties AS ip3 ON ip3.item_id=item.item_id and ip3.property_id=5
INNER JOIN item_properties AS ip4 ON ip4.item_id=item.item_id and ip4.property_id=6
etc...
WHERE item.something_else='words'
GROUP BY item_id

JOINではなくWHEREだけで検索を指定する方法として、私も試しました

SELECT item.field...
FROM items
WHERE item.something_else='words'
and item_id IN (select item_id from item_properties where property_id=3)
and item_id IN (select item_id from item_properties where property_id=4)
and item_id IN (select item_id from item_properties where property_id=5)
and item_id IN (select item_id from item_properties where property_id=6)
etc...

ただし、このアプローチは、どちらかといえば、セットのクエリにさらに時間がかかるように見えました。約 4 つのプロパティを選択すると、クエリ時間は約 4 ~ 5 秒になり、さらに多くのクエリが強制終了されるか、MySQL サーバーが完全にダウンする傾向があります。

私の知る限り、すべての _id フィールドは各テーブルでインデックス化されており、それぞれのテーブルの主キーでもあります。

クエリを改善する方法はありますか、またはクエリできるオプションの数を制限する必要があるのでしょうか?

4

2 に答える 2

1

すべての property_id が必要な場合は、集計後のフィルタリングを使用します

SELECT item.field
FROM items
INNER JOIN item_properties AS ip1 ON ip1.item_id=item.item_id and  
and ip1.property_id IN(3,4,5,6)
WHERE item.something_else='words'
GROUP BY item.field
HAVING COUNT(DISTINCT property_id )=4

4 は、property_id IN(3,4,5,6) の数です。

于 2014-11-18T13:00:20.327 に答える
0

のインデックスが必要だと思いますitem_properties

create index idx_item_properties_2 on item_properties(item_id, property_id)
于 2014-11-18T12:42:11.450 に答える