記事のディレクトリ
序文
インデックス付けするフィールドデータのバイト数が長すぎると、検索プロセス中に不要なパフォーマンスが消費されるため、この記事では、長いバイトフィールドに合理的にインデックスを付ける方法について説明します。
ヒント:以下はこの記事の内容です。以下のケースは参照用です。
索引付け方法
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('目标字段')