fc2ブログ

Home > 2010年01月

2010年01月 Archive

MySQLでの実行計画の確認方法ではまり

  • Posted by: Nakunaru
  • 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的なツールはないのかな?


はふ、今日も眠くなってきたので明日に持ち越し。

ORACLEでlimitあるいはoffsetを実現するのは無理なのか

  • Posted by: Nakunaru
  • 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したら眠くなってきたので、続きの検証はまた明日。

Index of all entries

Home > 2010年01月

タグクラウド
Categories
Monthly
Recent Entries
Recent Comments
Recent Trackbacks
Appendix

Nakunaru

    Author:Nakunaru

    データベース(ORACLEとかSQL ServerとかDB2とかMySQLとか)とか技術者教育とかプログラムとか。
    気になる技術を少しずつ勉強していきます。


Return to page top