MySQL 前缀索引
Posted cpuCode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 前缀索引相关的知识,希望对你有一定的参考价值。
mysql 前缀索引
用户表的电子邮件 :
create table SUser(
ID bigint unsigned primary key,
email varchar(64),
-- ...
)engine=innodb;
根据电子邮件查用户:
- email 没有索引,只能全表扫描
select f1, f2 from SUser where email='xxx';
email 上创建索引俩种方法 :
- 创建 index1 索引中,包含每个记录的整个字符串
- 创建 index2 索引中,只取每个记录的前 6 个字节
alter table SUser add index index1(email);
alter table SUser add index index2(email(6));
全/前索引区别
这俩个索引的区别:
- index1 :
index2 :
- 前缀索引的优点 : 占用的空间会更小
- 缺点 : 增加额外的记录扫描次数
俩索引的执行区别 :
select id, name, email
from SUser where email='cpucode@xxx.com';
index1 的执行顺序:
- 从 index1 索引树找匹配 ‘cpucode@xxx.com’ 的记录,取该 id 值
- 再主键索引上找该主键值的记录,判断 email 是否正确,并将该记录加入结果集
- 在 index1 索引树上找下条记录,当不满足 ‘pucode@xxx.com’ 时,就结束循环
index2 的执行顺序:
- 从 index2 索引树找匹配 ‘cpucod’ 的记录,找到的第一个是 ID1
- 到主键上查到主键值是 ID1 的行,当不是 ‘cpucode@xxx.com’ ,就丢弃该数据
- 再在 index2 索引树上找下条记录,当是 ‘cpucod’ ,取出 ID2,再到 ID 索引上取数据并判断,当正确,就将该记录加入结果集
- 重复上步,直到在 index2 上取的不是 ‘cpucod’ 时,循环结束
注意点
前缀索引 :
- 定义好长度,既节省空间,又没有较大的查询成本
- 创建索引 , 关注其区分度 , 当区分度越高越好
选取不同长度的前缀
- 按损失区分度比例,选择合适的前缀长度
select
count(distinct left(email, 4))as L4,
count(distinct left(email, 5))as L5,
count(distinct left(email, 6))as L6,
count(distinct left(email, 7))as L7,
from SUser;
前缀索引无法利用覆盖索引 :
- 用 index1 , 能利用覆盖索引,不用回到 ID 索引查询
- 用 index2,就要到 ID 索引 , 再去判断 email
select id, email from SUser
where email='cpucode@xxx.com';
其他方法
倒序存储 : 把身份证号倒过来存
select field_list from t
where id_card = reverse('input_id_card_string');
hash :
- 在表上再创建一个整数字段,保存身份证的crc ,并创建索引
alter table t add id_card_crc int unsigned, add index(id_card_crc);
当 crc32()
校验码可相同时,就用 id_card 精确判断
select field_list from t
where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string'
倒序存储 / hash 字段区别 :
- 额外空间 : 倒序存储在主键索引上,不会消耗额外的存储空间,而 hash 方法要增加一个字段。当长度过长 , 该对比差不多
- CPU消耗 : 倒序方式每次写和读时,都要调用
reverse
,而 hash 方式也要调用crc32()
。reverse 消耗会更小些 - 查询效率 : 用 hash 方式的查询性能更稳定。而倒序存储方式还是用的前缀索引的方式,还是会增加扫描行数
mysql 前缀索引
计算适合设置索引的长度,直到去重以后在一个固定值。
根据去重以后适合的长度设置索引。
计划查询
以上是关于MySQL 前缀索引的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则