mysql:14775
From: HIRATSUKA Sadao <HIRATSUKA Sadao <hiratsuka.sadao@xxxxxxxxxx>>
Date: Thu, 12 Mar 2009 10:05:22 +0900
Subject: [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@xxxxxxxxxx
14773 2009-03-12 09:31 ["linux@xxxxxxxxxx" <] MySQL による ORDER BY の最適化 14774 2009-03-12 09:50 ┣[Mikiya Okuno <Mikiya] -> 14775 2009-03-12 10:05 ┗[HIRATSUKA Sadao <hir] 14776 2009-03-12 10:20 ┗[HIRATSUKA Sadao <hir] 14777 2009-03-12 19:46 ┗["linux@xxxxxxxxxx" <]