1. 隠しインデックス
MySQL 8.0 では、非表示インデックス (不可視インデックス)、つまり目に見えないインデックスのサポートが開始されました。
非表示のインデックスはオプティマイザでは使用されませんが、維持する必要があります。アプリケーション シナリオ: ソフト削除、グレースケール リリース。
論理的な削除: オンラインでインデックスの削除と作成を行うことがよくありますが、前のバージョンの場合、インデックスを削除して後で削除が間違っていたことが判明した場合、別のインデックスを作成する必要があり、パフォーマンスに大きく影響します。MySQL8 では、これを行うことができ、インデックスを非表示インデックスに変更し (インデックスは利用できなくなり、クエリ オプティマイザーは使用できなくなります)、最後にインデックスを削除する前にインデックスを削除する必要があります。
グレー スケール リリース: これも同様です。オンラインでいくつかのテストを実施したいと考えています。最初に非表示のインデックスを作成できますが、これは現在の運用環境には影響しません。その後、いくつかの追加のテストに合格し、このインデックスに問題がないことがわかります。これを直接置くことができます。オンライン環境を有効にするために、インデックスが正式なインデックスに変更されます。
使用例 (グレースケール リリース):
create table t1(i int,j int); --创建一张t1表
create index i_idx on t1(i); --创建一个正常索引
create index j_idx on t1(j) invisible; --创建一个隐藏索引
show index from t1\G --查看索引信息
クエリ オプティマイザーを使用して以下を確認します。
explain select * from t1 where i=1;
explain select * from t1 where j=1;
ここでは、非表示のインデックスが使用されないことがわかります。
ここでは、オプティマイザのスイッチを通じて設定を開くことができます。これは、非表示のインデックスを設定するのに便利です。
select @@optimizer_switch\G; --查看 各种参数
赤い部分は、デフォルトのクエリ オプティマイザーが非表示のインデックスには表示されず、パラメーターを使用して変更できることです。非表示のインデックスを使用してテストできることを確認してください。
set session optimizer_switch="use_invisible_indexes=on'; --在会话级别设置查询优化器可以看到隐藏索引
次に、クエリ オプティマイザーを使用して以下を確認します。
explain select * from t1 where j=1;
非表示のインデックスを表示可能なインデックス (通常のインデックス) に変更します。
alter table t1 alter index j_idx visible; --变成可见
alter table t1 alter index j_idx invisible; --变成不可见(隐藏索引)
最後に、主キーを非表示のインデックス (隠しインデックス) に設定することはできません (MySQL には制限があります)。
2、降順インデックス
MySQL 8.0 では、降順インデックス (descendingindex) が実際にサポートされ始めました。InnoDB ストレージ エンジンのみが降順インデックスをサポートし、BTREE 降順インデックスのみがサポートされます。さらに、MySQL 8.0 では、GROUP BY 操作が暗黙的にソートされなくなりました。
MySQLでt2テーブルを作成する
create table t2(c1 int,c2 int,index idx1(c1 asc,c2 desc));
show create table t2\G
5.7 の場合、昇順または降順の情報は表示されません
降順インデックスの使用方法を示すためにデータを挿入してみましょう。
insert into t2(c1,c2) values(1,100),(2,200),(3,150),(4,50);
インデックスの使用状況を見てください
explain select * from t2 order by c1,c2 desc;
5.7で比較してみます
これは、今インデックスを使用するには追加の並べ替え操作が必要であることを示しています。
クエリを変更しましょう
explain select * from t2 order by c1 desc,c2 ;
MySQL8で使用される
もう 1 つのポイントは、group by ステートメントが 8 以降はデフォルトでソートされなくなったことです。
select count(*),c2 from t2 group by c2;
8 でソートしたい場合は、sort ステートメントを手動で追加する必要があります。
select count(*),c2 from t2 group by c2 order by c2;
3. 機能インデックス
関数がクエリに追加されるとインデックスが有効にならないことは以前からわかっているため、MySQL8 では関数インデックスが導入されています。
MySQL 8.0.13 では、インデックスでの関数 (式) 値の使用がサポートされ始めました。降順インデックスをサポートし、仮想列関数に基づいた JSON データのインデックス関数インデックスをサポートします。
関数インデックス(式)を使用する
create table t3(c1 varchar(10),c2 varchar(10));
create index idx_c1 on t3(c1); --普通索引
create index func_idx on t3( (UPPER(c2)) ); --一个大写的函数索引
show index from t3\G
explain select * from t3 where upper(c1)='ABC' ;
explain select * from t3 where upper(c2)='ABC' ;
関数インデックスの使用 (JSON)
create table t4(data json,index((CAST(data->>'$.name' as char(25)) )));
explain select * from t4 where CAST(data->>'$.name' as char(25)) = 'lijin ';
仮想列機能に基づいて機能インデックスを実装
関数インデックスは、MySQL で新しい列を追加するのと同じです。この列は関数に従って結果を計算し、関数インデックスを使用するときに計算された列をインデックスとして使用します。