不要なインデックスの削除をするため、対象のインデックスを一度invisibleに変更し
一週間程度様子を見、レスポンスが悪化していないことを確認した上で削除をしました。
しかし、実際に参照系のクエリの実行時間を確認したところ
visibleからinvisibleに変更した場合は、影響はありませんでしたが
invisibleにしたインデックスを削除すると、参照系のクエリの実行時間が大幅に伸びました。
上記の現象の後、削除したインデックスと同様のインデックスを再度作成したところ、
対象のクエリの実行時間が再びインデックス削除前と同様の時間まで短縮されました。
質問させていただきたいのですが、
invisibleにしているインデックスを削除することで
参照系のクエリの実行時間に影響することはあり得るのでしょうか。
追記
対象のSQL、実行計画、インデックス、テーブル構造を追記いたしました。
-- 対象のSQL
mysql
1SELECT msd.groups as p_name,CHAR_LENGTH(msd.groups)+(LENGTH(msd.groups)-CHAR_LENGTH(msd.groups))/2 as namelen, COUNT(*) as cnt,SUM(af.gross) as hassei,msd.disp 2FROM `mail_settings_detail` msd , af_result af 3WHERE 4 msd.category IN ('AAA','BBB','CCC','DDD') 5 AND af.tag_time BETWEEN '2020-05-01 00:00:00' AND '2020-05-15 23:59:59' 6 AND msd.pgid = af.pgid 7 AND msd.status = 1 8 AND af.status NOT IN ('XX','YY') 9GROUP BY msd.groups ORDER BY category , disp;
問題のインデックス:mail_settings_detailのstatus
statusがvisibleの場合の実行計画
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
|:--|:--:|--:|
|1|SIMPLE|af||range|pgid,tag_time,status|tag_time|4||35196|60|Using index condition; Using where; Using temporary; Using filesort|
|1|SIMPLE|msd||ref|pgid,status|pgid|4|DB.af.pgid|1|40|Using where|
statusがinvisibleの場合の実行計画
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
|:--|:--:|--:|
|1|SIMPLE|af||range|pgid,tag_time,status|tag_time|4||35196|60|Using index condition; Using where; Using temporary; Using filesort|
|1|SIMPLE|msd||ref|pgid|pgid|4|DB.af.pgid|1|13.33|Using where|
statusのインデックスを削除した場合の実行計画
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
|:--|:--:|--:|
|1|SIMPLE|msd||ALL|pgid||||651|4|Using where; Using temporary; Using filesort|
|1|SIMPLE|af||ref|pgid,tag_time,status|pgid|4|DB.msd.pgid|1178|0.72|Using where|
対象テーブルのインデックス
mysql
1CREATE INDEX pgid ON mail_settings_detail(pgid); 2CREATE INDEX userid ON mail_settings_detail(userid); 3CREATE INDEX mail_setid ON mail_settings_detail(mail_setid); 4CREATE INDEX status ON mail_settings_detail(status);
statusのインデックスがvisibleの場合の実行時間
0.302秒
statusのインデックスがinvisibleの場合の実行時間
0.215秒
statusのインデックス削除後の場合の実行時間
10.115秒
mail_settings_detailテーブル
レコード数:651
rowid : int11 primarykey
pgid : int11
category : varchar30
groups : varchar30
disp : int11
status : int11
他、本SQLに出てこないものが6カラム
af_resultテーブル
レコード数:290万
retstid : bigint20 primarykey
pgid : int11
gross : int11
tag_time : timestamp
status : enum
他、本SQLに出てこないものが27カラム
補足情報(FW/ツールのバージョンなど)
MySQL 8.0.17
回答1件
あなたの回答
tips
プレビュー