私はテーブルitems
とテーブルを持っていますitem_attributes
。
簡単にするために、テーブル項目に columnid
とcolumn があるとしますname
。もちろん、列にはインデックスがありid
ます。
テーブルには、、およびitem_attributes
の列がid
あり、インデックスは ONですitem_id
attribute_name
attribute_value
attrubute_name
ここで、結合を使用せずに、特定の属性を持つすべてのアイテムをクエリしたいと考えています。
次のクエリでこれを行います。
SELECT *
FROM items i
WHERE i.id IN (
SELECT item_id
FROM item_attributes a
WHERE a.attribute_name = 'SomeAttribute'
AND a.attribute_value = 'SomeValue'
)
サブクエリ自体は高速に実行されます。
最初にクエリ自体を実行し、その結果を IN クエリに使用する場合
SELECT *
FROM items i
WHERE i.id IN (1,3,5,7,10,...)
それも速いです。
ただし、クエリを組み合わせると非常に遅くなります (> 2 秒)。クエリ プランを調査すると、その理由がわかります。 .
1, 'PRIMARY', 'items', 'ALL', '', '', '', '', 149726, 'Using where'
2, 'DEPENDENT SUBQUERY', 'item_attributes', 'index_subquery', 'IDX_ATTRIBUTE_NAME', 'IDX_ATTRIBUTE_NAME', '4', 'func', 1, 'Using where'
このクエリを最適化する方法はありますか? サブクエリは常に小さな結果セット (<100 行) のみを返すことを知っています。