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

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

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

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

Q&A

2回答

4834閲覧

フルスキャンとなって応答に30秒以上かかる

imamoto_browser

総合スコア1161

MySQL

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

1グッド

0クリップ

投稿2015/06/07 16:38

編集2022/01/12 10:55

lang

1explain extended select `SID`,`Last_Name`,`First_Name`,`age`,`type`,`Job` from ((select `SID`,`Last_Name`,`First_Name`,`age`,`area`,`type`,`Job` from Customer left join Teletype on Customer.SID = Teletype.ID where SID > 60) union all (select `SID`,`Last_Name`,`First_Name`,`age`,`area`,`type`,`Job` from Customer left join Teletype on Customer.SID = Teletype.ID where Job like '%r%')) as uni order by SID DESC;

結果:
+----+--------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 14265300 | 100.00 | Using filesort |
| 2 | DERIVED | Customer | ALL | primary_idx | NULL | NULL | NULL | 908283 | 30.88 | Using where |
| 2 | DERIVED | Teletype | ALL | NULL | NULL | NULL | NULL | 12 | 100.00 | Using where; Using join buffer (Block Nested Loop) |
| 3 | UNION | Customer | ALL | NULL | NULL | NULL | NULL | 908283 | 100.00 | Using where |
| 3 | UNION | Teletype | ALL | NULL | NULL | NULL | NULL | 12 | 100.00 | Using where; Using join buffer (Block Nested Loop) |
| NULL | UNION RESULT | <union2,3> | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------------------+
6 rows in set, 1 warning (0.44 sec)

mysql> show index from Customer; +----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Customer | 1 | simple_idx | 1 | Telephone | A | 46 | NULL | NULL | YES | BTREE | | |
| Customer | 1 | primary_idx | 1 | SID | A | 204 | NULL | NULL | | BTREE | | |
+----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> show index from Teletype;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Teletype | 1 | simple_idx | 1 | telephone | A | 12 | NULL | NULL | YES | BTREE | | |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

上記コマンドをたたくと、CustomerテーブルのCustomerテーブルにインデックスは張っているにもかかわらず、上記のようにフルスキャンとなって応答に30秒以上(explain extendedを取り除いたクエリで)かかってしまいます。(出力される行数は38万件程度)

indexを効かせる方法を教えてください。

ikuwow👍を押しています

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

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

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

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

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

guest

回答2

0

ところで、refとrangeが記載されているページが見当たらないのですが、具体的な違いを教えていただけないでしょうか?

https://dev.mysql.com/doc/refman/5.0/en/explain-output.html#explain_type
マニュアルが一番参考になるのではないでしょうか。

出力結果が38万行ということなので Customer.SID > 60 という条件がほぼ全てのデータに一致してインデックスが使われていないんだと思います。
Index Hintという機能があるのでインデックスを強制的に使わせることはできるようです。(遅くなると思いますが・・・)
https://dev.mysql.com/doc/refman/5.1/en/index-hints.html

そもそもの目的は何でしょうか。クエリを速くしたい?インデックスの調査?

投稿2015/06/12 08:30

kodai

総合スコア759

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

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

tixure55

2015/06/14 18:03

目的はmysqlのクエリ毎でのオプティマイザの挙動の差異の確認ですね。あとは複合インデックスやらlike句やらいろいろな場合でのオプティマイザの判断基準について調べたいと思います。
guest

0

気になる点はいくつかありますがとりあえず Teletype.ID でインデックスを作成してみてはいかがでしょうか。

投稿2015/06/08 00:17

kodai

総合スコア759

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

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

imamoto_browser

2015/06/10 16:01

回答ありがとうございます、Teletype,IDにインデックスを張って、TeletypeのIDカラムをauto_incrementに置き換えたところ、Teletype.IDについてはrefに変わりました。しかし、Customerテーブルはインデックスが適用されず、未だフルスキャンです。 ところで、refとrangeが記載されているページが見当たらないのですが、具体的な違いを教えていただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問