背景 インデックスは諸刃の剣です。クエリ速度は向上しますが、DML 操作も遅くなります。結局のところ、インデックスのメンテナンスには一定のコストがかかります。そのため、インデックスについては、追加すべきものを追加し、不要なものを削除します。前者は加算であり、後者は減算です。しかし、実際の仕事では、誰もが前者を重視し、後者を行うことはめったにありません。理由は後者にあり、それは難しい。難しいのは操作そのものではなく、インデックスが役に立たないことをどうやって確認するかです。 役に立たないインデックスを識別する方法 非表示のインデックスが登場する前は、sys.schema_unused_indexes を使用して未使用のインデックスを識別できました。 MySQL 5.6 では、sys ライブラリがなくても、ビューのベース テーブルを介してクエリを実行できます。 mysql> 作成テーブル sys.schema_unused_indexes\G を表示します ************************** 1. 行 **************************** ビュー: schema_unused_indexes ビューの作成: CREATE ALGORITHM=MERGE DEFINER=`mysql.sys`@`localhost` SQL SECURITY INVOKER VIEW `sys`.`schema_unused_indexes` ( `object_schema`、` object_name`、 `index_name`)select` t`.`object_schema`は `object_schema`、` object_name`、 `t`.`index_name` as` index_name` a( ex_usage` `t`に` information_schema`.`Statistics` `s` on index_name` utf8)= `s`.`index_name`)))))))))))))) = 1)および( `s`.`seq_in_index` = 1))` t`.`object_schema`、 `object_name`character_set_client:utf8mb4による注文 照合接続: utf8mb4_0900_ai_ci セットに 1 行、警告 1 件 (0.00 秒) しかし、このアプローチにも欠点があります。 1. インスタンスが再起動されると、performance_schema 内のデータはクリアされます。 2. 上記のクエリに基づいてインデックスが削除され、クエリのパフォーマンスが突然低下した場合はどうなるでしょうか? 目に見えないインデックスの出現により、上記の欠点を効果的に補うことができます。インデックスを非表示に設定すると、FORCE INDEX が使用されている場合でも、オプティマイザーは実行プランを選択するときにインデックスを自動的に無視します。 もちろん、これは optimizer_switch 変数の use_invisible_indexes オプションによって決定され、デフォルトではオフになっています。インデックス調整前と調整後のクエリ実行プランの違いを確認したい場合は、次のようにセッションレベルでuse_invisible_indexesの値を調整できます。 mysql> テーブル slowtech.t1\G の作成を表示します ************************** 1. 行 **************************** 表: t1 テーブルの作成: CREATE TABLE `t1` ( `id` int(11) NULLではない、 `name` varchar(10) デフォルト NULL, 主キー (`id`)、 キー `idx_name` (`name`) /*!80000 非表示 */ ) エンジン=InnoDB デフォルト文字セット=utf8mb4 照合=utf8mb4_0900_ai_ci セット内の 1 行 (0.00 秒) mysql> explain select * from slowtech.t1 where name='a'; +----+-------------+--------+-----------+--------+---------------+-------+--------+----------+-----------+-------------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+--------+-----------+--------+---------------+-------+--------+----------+-----------+-------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 6 | 16.67 | where の使用 | +----+-------------+--------+-----------+--------+---------------+-------+--------+----------+-----------+-------------+ セットに 1 行、警告 1 件 (0.00 秒) mysql> セッション optimizer_switch="use_invisible_indexes=on" を設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> explain select * from slowtech.t1 where name='a'; +----+-------------+--------+-----------+---------+---------------+-----------+--------+----------+-----------+-------------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+--------+-----------+---------+---------------+-----------+--------+----------+-----------+-------------+ | 1 | SIMPLE | t1 | NULL | ref | idx_name | idx_name | 43 | const | 1 | 100.00 | インデックスを使用 | +----+-------------+--------+-----------+---------+---------------+-----------+--------+----------+-----------+-------------+ セットに 1 行、警告 1 件 (0.00 秒) 非表示のインデックスに対する一般的な操作 テーブル t1(id int 主キー、name varchar(10)、インデックス idx_name (name) 非表示) を作成します。 テーブル t1 を変更してインデックス idx_name を表示可能にします。 テーブル t1 を変更し、インデックス idx_name を非表示にします。 非表示のインデックスを確認する方法 mysql> information_schema.statistics から table_schema、table_name、index_name、column_name、is_visible を選択します。ここで、is_visible='no' です。 +--------------+-------------+-------------+-------------+-------------+ | TABLE_SCHEMA | TABLE_NAME | INDEX_NAME | COLUMN_NAME | IS_VISIBLE | +--------------+-------------+-------------+-------------+-------------+ | slowtech | t1 | idx_name | 名前 | NO | +--------------+-------------+-------------+-------------+-------------+ セット内の 1 行 (0.00 秒) 知らせ 1. 主キーインデックスを非表示に設定することはできません。 要約する 以上が、私がご紹介したMySQL 8の新機能「Invisible Indexes」です。お役に立てれば幸いです。ご質問がございましたら、メッセージを残していただければ、すぐに返信させていただきます。 以下もご興味があるかもしれません:
|
>>: Linux のファイル権限とグループ変更コマンドの詳細な説明
Q1: データベースにはどのようなインデックスがありますか?メリットとデメリットは何ですか? 1. ...
HTML では、<img> タグはテキスト内の画像タグを定義するために使用されます。その...
最近、仕事の都合で、MySQL で数字をフォーマットする必要がありましたが、インターネット上にはほと...
1 はじめにデータベースを設計する場合、画像や音声ファイルをデータベースに挿入することは避けられませ...
設定手順Linux システム: CentOS-7.0 MySQL バージョン: 5.7.21 Lin...
序文IE の将来のすべてのバージョンで Web ページの外観が一貫していることを保証するために、IE...
序文MySQL には次の 4 種類の演算子があります。算術演算子比較演算子論理演算子ビット演算子これ...
さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...
目次概要予防1. 使用方法2. 実装手順予備実装コード効果: Geo共通設定上記の構成を追加した後の...
◆お気に入りに追加例示するクリックすると、ブラウザのお気に入りメニューにウェブサイトが追加されます...
目次1. 環境整備2. Dockerをインストールする3. MySQLマスタースレーブデータベースを...
環境の準備1. 環境構築React Native 中国語ウェブサイト2. 開発ツール フロントエンド...
1. Pythonは起動時に自動的に実行されますPython の自己起動スクリプトがauto.pyで...
目次序文InnoDB ストレージ アーキテクチャInnodb テーブルスペースインドストレージディス...
Docker は、安全で繰り返し可能な環境でソフトウェアを自動的にデプロイする方法を提供し、コンピュ...