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