🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

Q&A

解決済

2回答

5632閲覧

MySQL:複合インデックスでのクエリのexplainを「using index」にする方法

yonotsui

総合スコア28

MySQL

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

0グッド

0クリップ

投稿2020/11/23 06:13

カラム「SetTime」「SiteName」をwhereに、カラム「SetTime」をorder byに使用したクエリを使用しています。
「SetTime」と「SiteName」は複合インデックスなのですがexplainすると「using index」ではなく「using index condition」となります。
ためしにkeyだけを「SetTime」だけのインデックスに指定してみましたが結果は変わりませんでした。

なぜusing indexとならないのでしょうか。
どうすればusing indexにできるのでしょうか。

クエリとexplain

force indexで複合インデックスを指定したクエリ

select * from dhashdiff force index(analyze_join_index) where SetTime<=637410929158399725&& SiteName='コジマネット' order by SetTime limit 1000; +----+-------------+-----------+------------+-------+--------------------+--------------------+---------+------+---------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+-------+--------------------+--------------------+---------+------+---------+----------+-----------------------+ | 1 | SIMPLE | dhashdiff | NULL | range | analyze_join_index | analyze_join_index | 266 | NULL | 1951470 | 10.00 | Using index condition | +----+-------------+-----------+------------+-------+--------------------+--------------------+---------+------+---------+----------+-----------------------+

force indexで複合インデックス、force keyでSetTimeを指定したクエリ

select * from dhashdiff force index(analyze_join_index) force key(settime_index) where SetTime<=637410929158399725&& SiteName='コジマネット' order by SetTime limit 1000; +----+-------------+-----------+------------+-------+----------------------------------+---------------+---------+------+---------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+-------+----------------------------------+---------------+---------+------+---------+----------+-----------------------+ | 1 | SIMPLE | dhashdiff | NULL | range | settime_index,analyze_join_index | settime_index | 8 | NULL | 1951470 | 10.00 | Using index condition | +----+-------------+-----------+------------+-------+----------------------------------+---------------+---------+------+---------+----------+-----------------------+

###create table

+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | dhashdiff | CREATE TABLE `dhashdiff` ( `SiteImgUrl` varbinary(2083) NOT NULL, `DHashDif` smallint(5) unsigned NOT NULL, `SetTime` bigint(19) unsigned NOT NULL, `ASIN` varbinary(10) NOT NULL, `SiteName` varchar(64) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`SiteImgUrl`,`ASIN`,`SiteName`), KEY `image_asin` (`ASIN`,`SiteImgUrl`), KEY `settime_index` (`SetTime`), KEY `asin` (`ASIN`), KEY `analyze_join_index` (`SetTime`,`SiteName`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

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

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

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

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

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

sazi

2020/11/23 11:32

前の質問は、なぜそのままなんですか?
yonotsui

2020/11/23 11:35

前の質問は解決しませんでした。 そして前の質問と今の質問の内容は内容に関係がありません。
sazi

2020/11/23 11:39

回答に関して実践したなら、その結果を返すべきです。 同じ質問者である事は関係しており、回答する意欲に関係しています。 解決してもしなくても良いというのなら別にいいですけど。
guest

回答2

0

なぜusing indexとならないのでしょうか。

「using index condition」となっているのは、ICPという最適化が入っているためです(参考)。

どうすればusing indexにできるのでしょうか。

using index conditionの方が効率的なので、意味がありません

投稿2020/11/23 06:17

maisumakun

総合スコア145967

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

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

guest

0

ベストアンサー

「SELECT で指定されているカラムや WHERE で指定されているカラムの情報が全てインデックスに含まれている場合」はusing indexとなるそうです。(https://techlife.cookpad.com/entry/2017/04/18/092524)

select SetTime, SiteName from ~ のようにindexのキーに含まれるカラムのみを要求していれば、using indexと出ると思います。
必要なカラムすべてを含むindexを作成しても、using indexと出ると思います。

記載されている例だとusing index conditionでパフォーマンスに問題ないと推測します。

投稿2020/11/23 09:17

gasbombe

総合スコア204

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

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

yonotsui

2020/11/23 11:43

おっしゃる通り取得するカラムをインデックスに使用するもので指定すれば「using index」となりました。 「using indexcondition」だとパフォーマンスが落ちると誤認識しておりました。 お二人ともありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問