[前][次][番号順一覧][スレッド一覧]

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" <]