質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

3676閲覧

Mysqlの評価処理(実行計画)の見方

lupus_dingo

総合スコア257

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

1グッド

4クリップ

投稿2018/05/09 15:50

お世話になっております。

以下の内容でテーブル作成&サンプルINSERTを行い、

mysql

1-- テーブル作成 2mysql> create table my_test ( 3 -> key1 varchar(8), 4 -> col1 int8, 5 -> col2 int8, 6 -> col3 int8, 7 -> constraint KEY_NAME primary key ( 8 -> key1, 9 -> col1 10 -> ) 11 -> ) ; 12 13ALTER TABLE my_test ADD INDEX index_2(col3); 14 15--データINSERT 16mysql> insert into my_test values('A001', 10000001, 20000001, 30000001); 17mysql> insert into my_test values('A001', 10000002, 100, 10); 18mysql> insert into my_test values('A001', 10000003, 100, 10); 19mysql> insert into my_test values('A001', 10000004, 100, 10); 20mysql> insert into my_test values('A001', 10000005, 100, 10); 21mysql> insert into my_test values('A001', 10000006, 100, 10); 22mysql> insert into my_test values('A001', 10000007, 100, 10); 23mysql> insert into my_test values('A001', 10000008, 100, 10);

Oracleで実行計画を取得するとどれくらい絞れるかが条件ごとに表示されると思います。
具体的には、以下のような感じです。(半分想像で書いています)

Key1(index_1) : index range scan  col3(index_2) : index range scan

同じようにMysqlでEXPLAINを確認すると以下の出力結果の通り1行しか出力されません。
ぼんやりとしたイメージではkey1に対して1行、col3に対して1行表示されるのかなと思ったのですがそうではないのでしょうか?

mysql> explain select * from my_test where key1='A001' and col3 between 10 and 20; +----+-------------+---------+------------+------+---------------+---------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+---------------+---------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | my_test | NULL | ref | PRIMARY | PRIMARY | 10 | const | 8 | 12.50 | Using where | +----+-------------+---------+------------+------+---------------+---------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec)

実際やりたいのはSQLのチューニングで
betweenを使用した場合に評価処理が1回で済むことをEXPLAINで証明したかったのですが、
そもそもOracleと全然違ったので質問させてもらいました。
EXPLAIN以外で確認ができるのであれば教えていただきたいです。

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下を参考に説明します。
MySQLのEXPLAINを徹底解説!!

実際にEXPLAINコマンドを使ってクエリの実行計画を見る際には次のようなステップを踏むといいだろう。

1.id/select_type/tableフィールドを見て、どのテーブルがどの順序でアクセスされるのかを知る。これらはクエリの構造を示すフィールドであると言える。サブクエリが含まれている場合にはEXPLAINの表示順とアクセスされる順序が異なる場合があるので気をつける必要がある。

2.type/key/ref/rowsフィールドを見て、各テーブルから行がどのようにフェッチされるのかを知る。どのテーブルへのアクセスが最も重いか(クエリの性能の足を引っ張っているのか)を、これらのフィールドから判断することが出来る。

3.Extraフィールドを見て、オプティマイザがどのように判断して、各々のテーブルへのアクセスにおいて何を実行しているのかを知る。Extraフィールドはオプティマイザの挙動を示すものであり、クエリの全体像を把握するのに役立つ。

で、結果はExtraフィールドがUsing whereなので、インデックスは使用されていません。

Using where・・・頻繁に出力される追加情報である。WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することが出来ない場合に表示される。

※公式はこちら(EXPLAIN の追加情報

また、出力が1行なので評価は1回です。

データ件数が少ない場合、全表検索となることが多く、この場合もこのケースでしょう。
証明するなら、実データで行うことだと思います。

投稿2018/05/10 00:16

編集2018/05/10 00:29
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2018/05/12 05:56

回答ありがとうございます。 実データでEXPLAINを試したところ、同じく出力は1行でした。 業務端末からこちらにアクセスすることはできないため 同じようなテーブル定義を作成して自宅でEXPLAINを出力しています。 実際のデータは100万件ほどでブロックごとにわけて全レコードに対してバッチ処理を行っています。 1点だけ教えていただきたいのですが、 上記の結果だとtypeはrefで、keyがPRIMARYとなっているのでEXPLAINには 複合主キーの1つであるkey1に対するレコードが出力されていると推測できるように気がするのですが、 col3に対する評価はなぜ出力されないのでしょうか?
sazi

2018/05/12 06:31

>col3に対する評価はなぜ出力されないのでしょうか? explainはカラムに対する評価ではないので。 期待されているのはcol3を含むインデックスの評価でしょうが、使用されていないので当然出力されません。 チューニングなら以下のインデックスが必要だと思います。 ALTER TABLE my_test ADD INDEX index_2(key1, col3);
lupus_dingo

2018/05/14 15:11

確かにインデックスは張ってないのでcol3に関してインデックスが表示されることはないですが、フィルタリングは入ると思ってました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問