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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

288閲覧

(MySQL)explain select * from [テーブル名] コマンドとshow index from [テーブル名] コマンドについて

widget11

総合スコア221

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2018/12/18 06:31

編集2018/12/18 06:36

今アプリケーションのパフォーマンス改善の為、既存のテーブルに対してインデックスを貼るという作業を人生で初めて行っております。
ネットに落ちているリファレンスを見るとexplain select * from テーブル名

idselecttypetabletypepossiblekeyskeys
1SIMPLEテーブル名ALLnullnull

のようなインデックステーブルが現れ、このTypeがALLであるとテーブルフルスキャン状態でindexが全く当たっていない状態と書いてありました。
そこでAlter table テーブル名 add index インデックステーブル名(カラム名);でインデックスを追加して、再度explain select * from テーブル名を実行してみたのですが、上のインデックステーブルは特に変更されておらず。。。。
そこでexplain select * from テーブル名のコマンドを実行してみると先ほど作成したインデックステーブルやその他のインデックステーブルみたいなものが数個出てきました。
インデックスが貼られているの以下のような形となったりするらしいですが。。。。
|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
|---|---|---|---|---|---|---|---|
1|SIMPLE|person_diary|ref|index_person_id|index_person_id|4|const|20|

ここで質問なのですが、単純に先ほど作成したインデックスをあてるにはどうすればよいでしょうか、何故インデックステーブルは貼られなかったのでしょうか。
またexplain select * from テーブル名;とshow index from テーブル名;で見れるテーブル名の違いは何でしょうか?
宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

explainは実行計画のコマンド、show indexはインデックスの一覧を表示のコマンドです。
explainの結果は指定するSQLの内容によって変化します。

SQL

1explain select * from テーブル名

だと条件は何もないので、インデックスを使用しない方が効率が良く、インデックスは使用されません。

追加したインデックスで指定したカラム名をcolumnAとすると、

SQL

1explain select * from テーブル名 where columnA=

のように指定すると結果が変わってくるはずです。

投稿2018/12/18 07:02

編集2018/12/18 09:48
sazi

総合スコア25138

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

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

0

where句を指定しないのにindex使うわけないじゃないですか。
全件出力するんだから。
INDEXを貼ったカラムをwhere句で指定したselectクエリを発行してみてください。

ちなみにexplainは、クエリを実行する時に使われる予定のインデックスが確認できるだけなので、実際にそのテーブルにはられているINDEXの一覧を確認するためには

SHOW INDEXES FROM テーブル

をやってみてください。

mysql> show indexes from posts; +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | posts | 0 | PRIMARY | 1 | id | A | 9 | NULL | NULL | | BTREE | | | | posts | 1 | posts_parent_id | 1 | parent_id | A | 9 | NULL | NULL | YES | BTREE | | | +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec) mysql> explain select * from posts; +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | posts | ALL | NULL | NULL | NULL | NULL | 9 | | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ 1 row in set (0.00 sec) mysql> explain select * from posts where parent_id = 2; +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+ | 1 | SIMPLE | posts | ref | posts_parent_id | posts_parent_id | 5 | const | 2 | Using where | +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+

投稿2018/12/18 07:05

kunai

総合スコア5405

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

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

0

以下のようにインデックスをつけたカラムを条件に入れてみてください。

SQL

1explain select * from テーブル名 where カラム名 = 1;

show indexはテーブルに設定されているインデックスが確認できます。
explainは実際に発行されたクエリに利用されるインデックスが確認できます。

ちなみにリファレンスはネットには落ちていないですよ。

投稿2018/12/18 06:55

tabuu

総合スコア2449

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問