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 的执行顺序:

  1. 从 index1 索引树找匹配 ‘cpucode@xxx.com’ 的记录,取该 id 值
  2. 再主键索引上找该主键值的记录,判断 email 是否正确,并将该记录加入结果集
  3. 在 index1 索引树上找下条记录,当不满足 ‘pucode@xxx.com’ 时,就结束循环

index2 的执行顺序:

  1. 从 index2 索引树找匹配 ‘cpucod’ 的记录,找到的第一个是 ID1
  2. 到主键上查到主键值是 ID1 的行,当不是 ‘cpucode@xxx.com’ ,就丢弃该数据
  3. 再在 index2 索引树上找下条记录,当是 ‘cpucod’ ,取出 ID2,再到 ID 索引上取数据并判断,当正确,就将该记录加入结果集
  4. 重复上步,直到在 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组合索引“最左前缀”原则

mysql前缀索引的索引选择性

Mysql中的联合索引前缀索引覆盖索引

MySQL前缀索引

MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序

mysql索引之前缀索引