mysql:9359
From: seiji takegata <seiji takegata <takegata@xxxxxxxxxx>>
Date: Fri, 14 May 2004 02:22:24 +0900
Subject: [mysql 09359] Re: distinct でデータ欠落
竹形です。 > マニュアルの「5.2.9 MySQL による LIMIT の最適化」を見ると > > ------------------------------------MySQL日本語マニュアル抜粋start > 5.2.9 MySQL による LIMIT の最適化 > > HAVING を使用するのではなく LIMIT row_count を使用している場合、MySQL に > よるクエリの処理方法が異なる場合があります。 > > ・LIMIT を使用して数レコードしか選択していないと、フルテーブルスキャンが > 行われそうな場合に、MySQL はインデックスを使うことがある。 > ・ORDER BY とともに LIMIT row_count を使用している場合、MySQL ではすべて > のテーブルがソートされるのではなく、最初の row_count レコードの検索が > 行われた時点でただちにソートを終了する。 > ・LIMIT row_count を DISTINCT とあわせて使用した場合、MySQL は一意の > row_count 行のレコードを検索するとただちに停止する。 > > ------------------------------------MySQL日本語マニュアル抜粋end > > 「ORDER BY」と「LIMIT」を同時に使うと、全てのデータをソートしないと > 書かれています。 > また「LIMIT」と「DISTINCT」を使用した場合も全てのデータを検索しないと記載さ > れ > ています。 > DISTINCTと「LIMIT」、あるいは「ORDER BY」と「LIMIT」を共に使う場合は > MySQLは勝手に最適化してしまうようです。 > これは「LIMITの制限によって表示されない部分のソートは行わない」という最適化 であって、この最適化によって得られる結果に違いが生じることは無いと思います。 たとえば、 mysql> select id,a from test; +----+------+ | id | a | +----+------+ | 1 | 4 | | 2 | 5 | | 3 | 6 | | 4 | 1 | | 5 | 2 | +----+------+ 5 rows in set (0.00 sec) mysql> select id,a from test order by a limit 2; +----+------+ | id | a | +----+------+ | 4 | 1 | | 5 | 2 | +----+------+ 2 rows in set (0.00 sec) となります。マニュアルの文章では、limit 2 によって、上から2行目までしかソートの 対象にならないと読めてしまいそうですが、実際にはそうではなくて、表示の対象から 外れているid=1,2,3の行はわざわざソートするまでもない、ということでしょう。 -- seiji takegata takegata@xxxxxxxxxx
9354 2004-05-13 23:53 [Koichi Shimamura <ma] distinct でデータ欠落 9355 2004-05-14 00:11 ┗[seiji takegata <take] 9358 2004-05-14 01:32 ┣["KATAYOSE hakuo" <ka] -> 9359 2004-05-14 02:22 ┃┗[seiji takegata <take] 9360 2004-05-14 02:50 ┗[seiji takegata <take] 9364 2004-05-14 09:54 ┗[Koichi Shimamura <MA] Re: distinct でデータ 9365 2004-05-14 10:43 ┗[Koichi Shimamura <MA] Re: distinct でデータ欠落 9366 2004-05-14 10:57 ┣[seiji takegata <take] 9368 2004-05-14 11:29 ┗["HIROSE, Masaaki" <h] 9371 2004-05-14 20:20 ┗[Koichi Shimamura <ma]