一意のインデックスを構成する 4 つの列を使用して、テーブルから約 20 ~ 100 行を選択したいと考えています。
私が思いついた最初のアプローチは、以下を使用することでしたOR
:
SELECT ...
WHERE (w_id = ? AND type_id = ? AND object_id = ? AND part_name = ?)
OR (w_id = ? AND type_id = ? AND object_id = ? AND part_name = ?)
OR [...]
行コンストラクターを使用したソリューションも見ました。
SELECT ...
WHERE (w_id, type_id, object_id, part_name) IN ((1,2,3,''),(1,2,4,''), [...])
ただし、多くの行を選択する場合、これはパフォーマンスが悪いとのことでした。
どちらのソリューションのパフォーマンスが優れているか、または別のソリューション (クエリの分割など) を使用する必要がありますか?
前もって感謝します!
テーブル構造
CREATE TABLE page(
page_id PRIMARY KEY AUTO_INCREMENT,
w_id INTEGER NOT NULL,
ns_id INTEGER NOT NULL,
type_id INTEGER NOT NULL,
object_id INTEGER NOT NULL,
part_name VARCHAR(20) NOT NULL,
);
w_id
とは両方ともns_id
外部キーです。
インデックスは 1 つだけです。これは、列w_id
、type_id
、object_id
およびを含む一意のインデックスpart_name
です。
計測
テーブルに約 70 万行を入力し、3 つのクエリを実行しました (これも using を使用したものUNION
です)。私はいつも同じ行を照会しました。結果は次のとおりです。
Solution Time [s] EXPLAIN
with OR 0.0003 ref
with IN 0.4546 ALL
UNION 0.0004 const
IN
を使用するとフル テーブル スキャンが発生する可能性があるという Raymond の推測は証明されました。ただし、結果はそれを示してOR
おり、UNION
まったく同じ時間を示しています。
私が心配しているのは、これらの結果が最適化後にのみ達成されたという事実です. 最適化の前に、ソリューションでもOR
約 0.3 秒かかりました。