MySQLでロングバイトフィールドのインデックスを作成する方法


序文

インデックス付けするフィールドデータのバイト数が長すぎると、検索プロセス中に不要なパフォーマンスが消費されるため、この記事では、長いバイトフィールドに合理的にインデックスを付ける方法について説明します。


ヒント:以下はこの記事の内容です。以下のケースは参照用です。

索引付け方法

1.プレフィックスインデックス

MySQLがプレフィックスインデックスをサポートしている場合、長いフィールドのプレフィックスインデックスを作成できます。構文は次のとおりです。

alter table T add index index01(email(6));

上記のSQLステートメントはプレフィックスインデックスです。QQメールボックスの場合、最初の6桁がQQ番号の一部であり、スペースをほとんどとらないと想像してください

しかし、QQメールボックスでない場合はどうなりますか?メールボックスの最初の6桁が文字列の場合、重複が発生する可能性が非常に高くなります。たとえば、[email protected]および[email protected]、最初の6文字はすべてzhangsですが、これにより検索数が増加します。

では、どのように接頭桁を選択するのでしょうか?:インデックスの識別に依存します。インデックスの識別が大きい場合、接頭桁を少なくすることができます。

これが参照用のアルゴリズムです

先计算出索引的区分度
select count(distinct 字段名) as dis from T\
然后依次尝试不同的前缀长度
select 
	count(distinct left(字段名,4)) as dis4,
	count(distinct left(字段名,5)) as dis5,
	count(distinct left(字段名,6)) as dis6,
	count(distinct left(字段名,7)) as dis7,
from T
由于使用前缀索引必然导致区分度下降 , 因此可以设定一个可接受范围,5%
然后计算出dis4~dis7中不低于dis*0.95的值,选中最小的长度做为前缀索引长度

注:プレフィックスインデックスとカバーインデックスを同時に使用することはできません

2.逆順ストレージ

これまでIDカードをインデックスとして使用したことはありませんが、フラッシュバックストレージ使用してIDカードの最後の6桁にインデックス付けるとより高度な識別が可能になります。

3.ハッシュフィールド

ハッシュフィールドを使用するには、テーブルに別の整数フィールドを作成し、フィールドに対してハッシュ(crc32())演算を実行して結果取得する必要があります。
これにより、フィールドの長さが短くなり、識別が向上します。ただし、ハッシュ後、フィールドでの同等の検索のみが可能です

alter table T add id_crc int unsigned ,add index(id_crc) //建立hash字段
select field from T where id_crc = crc32('目标字段')

おすすめ

転載: blog.csdn.net/qq_45596525/article/details/115056777