学什么可以先做网站,软件工程师证书有用吗,404 not found网站,竞价关键词排名软件MySQL是支持前缀索引的#xff0c;可以定义字符串的一部分作为索引#xff0c;如果创建索引的语句不指定前缀长度#xff0c;那么索引就会包含整个字符串。 alter table SUser add index index1(email);alter table SUser add index index2(email(6));
如上两个创建索引的语…MySQL是支持前缀索引的可以定义字符串的一部分作为索引如果创建索引的语句不指定前缀长度那么索引就会包含整个字符串。 alter table SUser add index index1(email);alter table SUser add index index2(email(6));
如上两个创建索引的语句index2(email(6))这个索引结构中只取邮箱字段的前6个字节所以占用的空间会更小这就是使用前缀索引的优势但是也同时带来了损失比如会增加额外的记录扫描次数。
使用前缀索引定义好长度就可以做到既节省空间又不用额外增加太多的查询成本。这个和实际存储的数据有关。也就是需要关注数据的区分度区分度越高越好区分度越高意味着重复的键值越少。因此可以通过统计索引上有多少个不同的值来判断要使用多长的前缀。 select count(distinct email) as L from SUser; 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;
使用前缀索引很可能会损失区分度所以需要预先设定一个可以接受的损失比例比如5%。然后在返回的L4-L7中找出不小于L*95%的值。
前缀索引也会影响覆盖索引既前缀索引就用不上覆盖索引对查询性能的优化了。
如果业务需求上只有等值查询在对身份证号前6位是地址码前缀区分度比较小这类数据设置前缀索引时还可以采取以下两种方法
1、使用倒序存储查询的时候参考下述语句 select field_list from t where id_card reverse(input_id_card_string);
2、使用hash字段即在表上再创建一个整数字段来保存身份证号的校验码同时在这个字段上创建索引。 -- 添加字段并创建索引alter table t add id_card_crc int unsigned, add index(id_card_crc);-- 查询语句select field_list from t where id_card_crccrc32(input_id_card_string) and id_cardinput_id_card_string
使用倒序存储和hash字段都不支持范围查询。
正文止。 感兴趣的朋友欢迎关注我的公众号哈公众号上已经集成了AI大模型大家可以过来聊天、问问题了