使用されず役に立たないインデックスを定義するのは,SQLアンチパターンの1つ「インデックスショットガン」として知られています。使用されていないインデックスを定義するのは,ディスク容量を圧迫して,さらに更新コストも掛かるという良いこと無しな状態です。実際には,あなたが使用されていないインデックスを見つけたとしても,安易にドロップするのは非常に危険です。ドロップするのは時間がかかりませんが,インデックスを再構築するまでには時間がかかります。万が一そのインデックスが使用されているクエリが存在するとしたら,その時点から障害につながってしまう可能性があります。Indexes」を使ってインデックスを外した時の影響を調べてみましょう。今回はDockerHub上のMySQLイメージを利用して行います。バージョンは8.0.18を使用しています。--secure-file-priv=/tmp上記の操作で起動して,以下のようにMySQLに接続をしていきます。MySQLにはじめてのデータを入れてみるからKEN_ALL.CSVを利用して作成していきます。第2回と異なる点としては,テーブルの構造を改変して以下の様にします。zip_codeとold_zipcodeの複合インデックス,そしてzip_code単体でのインデックスを追加で作成しています。ken_all.sqlデータベースにアクセスしてみて,以下のクエリを打って同じ結果が得られていれば大丈夫です。sec)無駄なインデックスを特定する現在使われていないインデックスを特定する必要があります。Toolkitのpt-duplicate-key-checkerを使う方法と,MySQL5.7から追加されたsys.schema_unused_indexesを利用する方法を紹介したいと思います。Toolkitの1つで,これを使うと名前の通り重複したキーやインデックスを発見することができます。Toolkitのインストール方法に関しては解説しません。aptやyum,Homebrewといったソフトウェアで簡単にインストールができるので,OSやディストリビューションに合わせてインストールをしてください。公式のインストールガイドはこちらになります。いうわけで実行をしてみましょう。2結果の部分が2つあり,どこに重複するキーやインデックスが存在するのかというのが上部に表示され,下部にはサマリーが書かれています。サマリーから,インデックスが2個あって,そのうち1個が重複していることがわかります。上部からは詳細なメッセージと,そのインデックスを除外するためのDDLが出力されています。この結果をファイルとして取っておいてMySQLクライアントで実行することで,重複するキーを一気に除外することも可能です。5.7から導入されたviewで,MySQLが起動してから一度も使用されていないindexを表示してくれます。sec)まだクエリを一度も発行していないので,2件とも検知されていることがわかります。そこで,試しに下記のクエリを実行してみましょう。sec)実行後再度確認をしてみると,以下のようになるはずです。sec)気をつける点としては,後から追加したindexが使用されるようになって不要になっているindexがあっても,上手く検知ができない事に注意が必要です。十分な期間を置いて実施しないと,月次のバッチ等で使用しているindexを誤って無効にしてしまう可能性があるので注意しましょう。Indexesを試してみるさてここまでで不要なインデックスに関して簡単に知ることができました。INDEXするのはかなり恐ろしいです。Indexesを使ってみましょう。sec)この時点の状態では,index_zipcode_on_zip_code_and_old_zip_codeが選択されていそうという事がわかります。ここで以下のクエリを実行し,invisibleな状態にしてみます。invisible;この状態で再度explainを取ってみましょう。sec)ということでオプティマイザーから選択されない状態になりました。続いて元に戻してみましょう。sec)元の状態に即座に直すことができました。invisibleのトグルになっていることはわかっていただけたと思います。不安になることとして,ヒント句を指定している場合にどういった挙動になるか気になると思います。invisible;一旦インデックスを再びinvisibleにします。その状態で,わざとinvisibleにしたindex_zipcode_on_zip_code_and_old_zip_codeを指定をしてみましょう。'zipcode'エラーになってしまいました。いうわけで,ヒント句を使用していたとしても実は使われていたという事にはなりません。ちなみに,存在しないindexを指定するとエラーになってしまうので,逆にヒント句を多用している場合には,事前に書き換えておく必要があるので注意をしましょう。まとめ今回は重複したキーやインデックスを調査し,一時的に使用しないようにする方法について説明しました。これから年末に向けて大掃除の時期が近づいておりますが,皆様のMySQLのインデックスの掃除にご利用ください。技術統括本部のエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。好きな戦法は四間飛車。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。