mysql:16253
From: "yoku ts." <"yoku ts." <yoku0825@xxxxxxxxxx>>
Date: Thu, 9 Jul 2015 20:13:07 +0900
Subject: [mysql 16253] Re: [mysql 16252] ORDER BY句を指定しなかった場合のSELECT結果について
こんばんは、yoku0825といいます。
わたしもマニュアルに見つけられなかったんですが、
実装上は「条件が揃えば同じレコードが返る」です。
テーブルスキャンの場合、
* InnoDBではクラスターインデックスの昇順に並びます
* PRIMARY KEYがあればPRIMARY KEY,
PRIMARY KEYがなくてUNIQUE KEYがあれば最初に定義されたUNIQUE KEY,
どちらもなければ6バイトの暗黙の行ID順に並べられます。
https://gist.github.com/yoku0825/6d3cae7b5fb2744fe801#file-innodb_pk-md
https://gist.github.com/yoku0825/6d3cae7b5fb2744fe801#file-innodb_nonpk-md
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.13.2 クラスタインデックスとセカンダリインデックス
http://dev.mysql.com/doc/refman/5.6/ja/innodb-index-types.html
* MyISAMの場合は物理的に.MYDファイルに入っている順番で並びます
https://gist.github.com/yoku0825/6d3cae7b5fb2744fe801#file-myisam-md
何らかのキーを選んでいた場合、そのキーの並び順になります。
InnoDBでPKがあれば、同じデータ同じSQLで再現可能だと思います。
InnoDBでPKなし、MyISAMの場合は保証が難しいです。
バックアップが物理ファイルであれば可能性はあるかも知れませんが、「ダンプデータ」ということはmysqldumpっぽいですよね…?
その場合、mysqldumpがテーブルをSELECTした時に何のインデックスも使わずにデータを読んでいれば…とか微妙な気がします。
https://gist.github.com/yoku0825/6d3cae7b5fb2744fe801#file-myisam_mysqldump-md
内部的な事情でいうと、
* handler::ha_rnd_init が呼ばれる
* こいつが ha_innobase::rnd_init や ha_myisam::rnd_init を呼ぶ
* handler::ha_rnd_next が呼ばれる
* こいつが ha_innobase::rnd_next や ha_myisam::rnd_next を呼ぶ
* HA_ERR_END_OF_FILE が返るまで rnd_next を呼ぶループ
です。詳しく知りたい場合はこのあたりを丁寧に追う感じになると思います。
バイナリーログが残っていてbinlog_format= MIXEDかROWならそちらから追えるかも知れません。
とか思いました(もう検討済みですかね。。
yoku0825,
2015年7月9日 15:08 林正紀 <hayashi.masa.norii@xxxxxxxxxx>:
> ORDER BY句を指定しなかった場合、SELECT文で取得するデータの並び順についての質問です。
>
> 一般的なSQLでは、ORDER BY句を指定しなかった場合、
> その検索結果の並び順は保証されないものと認識しています。
> MySQLにおいても、仕様上はそうであったと記憶しています。
> (マニュアルの記述箇所がみつけられなかったのですが)
>
> こちらについて、「実装レベル」では実際どうなのか
> (本当に仕様通り不定なのか、実際には必ずなにがしかの順序で変えるのか)を知りたいのです。
>
> 具体的には、過去に実行したSQLが判明しており
> そのSQLで具体的にどのレコードが抽出されたかを特定したく
> その過去の時点のダンプデータもあるのですが
> 該当SQLがORDER BY句を含んでおらず、LIMITが指定されており
> (例えば SELECT * FROM some_table LIMIT 1 のようなSQLです)
> 過去流したSQLとそのダンプデータで実行した結果が
> そのSQLを流した当時のものと同じレコードがセレクトされるかが保証できるかを確認したいのです。
>
> 調査したいSQLも、実行計画が full scanになるようなクエリです。
> また、その該当テーブルにはデータはINSERT/UPDATEはされますが、DELETEはされません。
> UPDATEが走るので、カラムレベルでは完全に同じレコードが再現できない可能性はありますが
> 同じレコード(同じPKのレコード)が得られるかどうかが知りたいです。
>
> MySQLのバージョンは、5.1系
> ストレージエンジンはMyISAM / InnoDB それぞれについてです。
>
> どなたかご存知のかたいましたら、ご教示いただけますでしょうか。
> 以上、よろしくお願いいたします。
16252 2015-07-09 15:08 [林正紀 <hayashi.masa] ORDER BY句を指定しなかった場合のSELECT結果について -> 16253 2015-07-09 20:13 ┗["yoku ts." <yoku0825] Re: [mysql 16252] ORDER BY句を指定しなかった場合のSELECT結果について 16254 2015-07-09 20:49 ┗[林正紀 <hayashi.masa] Re: [mysql 16253] Re: [mysql 16252] ORDER BY句を指定しなかった場合のSELECT結果について 16255 2015-07-10 12:47 ┗["yoku ts." <yoku0825] Re: [mysql 16254] Re: [mysql 16253] Re: [mysql 16252] ORDER BY句を指定しなかった場合のSELECT結果について 16256 2015-07-10 20:04 ┗[林正紀 <hayashi.masa] Re: [mysql 16255] Re: [mysql 16254] Re: [mysql 16253] Re: [mysql 16252] ORDER BY句を指定しなかった場合のSELECT結果について