Home > 2010年01月
2010年01月 Archive
MySQLでの実行計画の確認方法ではまり
- 2010-01-07 Thu 00:06:25
- メモ
1つ前の記事
http://hitai.blog72.fc2.com/blog-entry-47.html
にて、ORACLEでlimitができないか、という話をしていて、まずはMySQLでlimit句を使用したときに、索引を使うかどうかという所を検証していて、ちょっと混乱したので整理中です。
■やっとこと
・CREATE TABLE test_tab (no int, name varchar(5)) engine=innodb;
・INSERT INTO test_tab VALUES(1,'aaa');
・INSERT INTO test_tab SELECT * FROM test_tab; X 十数回繰り返し(200万件程度にした)
・INSERT INTO test_tab VALUES(2,'bbb');
・commit;
・CREATE INDEX test_idx ON test_tab(no);
ここまで準備
・EXPLAIN SELECT * FROM test_tab WHERE no=1;
ここでフルスキャンになることを期待していたんだけど、出て来たのは「key : test_idx」。
おかしい。
ここでフルスキャンになっといて、limitつけたら索引を使ったよ、やったね!
というのが想定してたシナリオなのに、まず最初のフルスキャンが発生しない。
MySQLってコストベースだよねぇ?
違うのかな。
■疑問点
・EXPLAINで出力される実行計画は、実際に使われた計画ではなく、想定される計画っぽい。というかそういうこと。
→オプションでSQLも実行してしまうとか、SQL Serverみたいに実際に使用した計画を出すオプションとかないのか?
・EXPLAINではなく、トレースをとってみるか、と思ったんだけどマニュアルにはトレース関連の記述があまり見当たらない。
OSレベルでのトレースはあったけど。
→ORACLEのSQL_TRACEみたいなのとか、statspack的なツールはないのかな?
はふ、今日も眠くなってきたので明日に持ち越し。
http://hitai.blog72.fc2.com/blog-entry-47.html
にて、ORACLEでlimitができないか、という話をしていて、まずはMySQLでlimit句を使用したときに、索引を使うかどうかという所を検証していて、ちょっと混乱したので整理中です。
■やっとこと
・CREATE TABLE test_tab (no int, name varchar(5)) engine=innodb;
・INSERT INTO test_tab VALUES(1,'aaa');
・INSERT INTO test_tab SELECT * FROM test_tab; X 十数回繰り返し(200万件程度にした)
・INSERT INTO test_tab VALUES(2,'bbb');
・commit;
・CREATE INDEX test_idx ON test_tab(no);
ここまで準備
・EXPLAIN SELECT * FROM test_tab WHERE no=1;
ここでフルスキャンになることを期待していたんだけど、出て来たのは「key : test_idx」。
おかしい。
ここでフルスキャンになっといて、limitつけたら索引を使ったよ、やったね!
というのが想定してたシナリオなのに、まず最初のフルスキャンが発生しない。
MySQLってコストベースだよねぇ?
違うのかな。
■疑問点
・EXPLAINで出力される実行計画は、実際に使われた計画ではなく、想定される計画っぽい。というかそういうこと。
→オプションでSQLも実行してしまうとか、SQL Serverみたいに実際に使用した計画を出すオプションとかないのか?
・EXPLAINではなく、トレースをとってみるか、と思ったんだけどマニュアルにはトレース関連の記述があまり見当たらない。
OSレベルでのトレースはあったけど。
→ORACLEのSQL_TRACEみたいなのとか、statspack的なツールはないのかな?
はふ、今日も眠くなってきたので明日に持ち越し。
ORACLEでlimitあるいはoffsetを実現するのは無理なのか
- 2010-01-06 Wed 00:27:42
- ORACLE
表題の通り。
すぐに思いつくのは、インラインビューを使ってrownumで絞り込むという手法。
似たようなことは他の方も考えているようで。
http://q.hatena.ne.jp/1128063931
Oracleでlimit offsetもどき - よねのはてな
で、これで出来るっちゃーできるんですが、インラインビューがフルスキャンなのか気に入らない。
気に入らないというか、データ量によっては使い物になりませんよね。
PostgreSQLだとどうか知りませんが、MySQLではlimitでインデックスが使えるんだとか。
http://dev.mysql.com/doc/refman/4.1/ja/mysql-indexes.html
で、ほんとかよってことで試してみたんですけど、ちょっと動きを勘違いしてたみた。
確かにインデックスは使うんだけど、limitの文だけインデックススキャンしてくるわけじゃないような…
テストデータつくってexplainしたら眠くなってきたので、続きの検証はまた明日。
すぐに思いつくのは、インラインビューを使ってrownumで絞り込むという手法。
似たようなことは他の方も考えているようで。
http://q.hatena.ne.jp/1128063931
Oracleでlimit offsetもどき - よねのはてな
で、これで出来るっちゃーできるんですが、インラインビューがフルスキャンなのか気に入らない。
気に入らないというか、データ量によっては使い物になりませんよね。
PostgreSQLだとどうか知りませんが、MySQLではlimitでインデックスが使えるんだとか。
http://dev.mysql.com/doc/refman/4.1/ja/mysql-indexes.html
で、ほんとかよってことで試してみたんですけど、ちょっと動きを勘違いしてたみた。
確かにインデックスは使うんだけど、limitの文だけインデックススキャンしてくるわけじゃないような…
テストデータつくってexplainしたら眠くなってきたので、続きの検証はまた明日。
Home > 2010年01月
- タグクラウド
-
- Categories
- Monthly
- Recent Entries
- Recent Comments
- Recent Trackbacks
- Appendix
- Author:Nakunaru
データベース(ORACLEとかSQL ServerとかDB2とかMySQLとか)とか技術者教育とかプログラムとか。
気になる技術を少しずつ勉強していきます。