1

一意のインデックスを構成する 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_idtype_idobject_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 秒かかりました。

4

1 に答える 1