2009年3月12日

[mysql 14775] Re: MySQL によるORDER BY の最適化

ひらつかです。

> 「連続しないキー部分に対して ORDER BY を実行する場合。
> SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2 」

こういうインデックスががあるとすると、

create index t1_idx1 on t1 (key1, key2);


インデックスの中身はこういうふうに並びます。

(key1, key2) = {
(1, 1),
(1, 2),
(1, 2),
(1, 2),
(1, 3),
(1, 3),
(2, 1),
(2, 1),
(2, 2),
(2, 3),
(2, 3),
(2, 3),
(3, 1),
(3, 2),
(3, 3)
}

このとき、以下のSQLは
SELECT * FROM t1 WHERE key1 = 2 ORDER BY key2

(1, 1), // ここから
(1, 2),
(1, 2),
(1, 2),
(1, 3),
(1, 3), // ここまで
(2, 1),
(2, 1),
(2, 2),
(2, 3),
(2, 3),
(2, 3),
(3, 1),
(3, 2),
(3, 3)

「ここから」「ここまで」を順番にアクセスすれば、
すでにORDER BY key2が済んでいることになります。

一方、例題のSQLは
SELECT * FROM t1 WHERE key2 = 2 ORDER BY key2

(1, 1),
(1, 2), // ここから
(1, 2),
(1, 2), // ここまでと
(1, 3),
(1, 3),
(2, 1),
(2, 1),
(2, 2), // ここと
(2, 3),
(2, 3),
(2, 3),
(3, 1),
(3, 2), // ここ
(3, 3)

このように「連続しないキー部分」を3箇所とびとびにアクセスするので、
(もう少し他の条件があって)データの絞込みに t1_idx1 を使うことが
できたとしても、データを集めてからあらためてソートをする必要があります。

--
平塚貞夫 hiratsuka.sadao@xxxxx

投稿者 xml-rpc : 2009年3月12日 10:05
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/83169
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。