文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL45讲之前缀索引 - flowers

2020-06-03 10:09

关注

MySQL45讲之前缀索引 - flowers

本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。

前言

本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。

前缀索引

对于像SELECT * FROM t WHERE email = "xxxx@163.com"的查询语句,如果不对email列建立索引,那么将会进行全表扫描。

对字符串建立索引,可以对整个字符串建立索引,也可以只对前几个字符建立索引,第二者就是所谓的前缀索引方式。

优点

节省存储空间。如果字符串长度比较长,需要对整个字符串建立索引,那么索引树占用的存储空间时很大的。而如果只是对前一部分字符建立索引,那么可以很好的节省存储空间。

缺点

可能会增加扫描行数,影响查询性能。因为整个字符串可能不相同,但是前缀可能是相同的,导致使用前缀索引时,需要更多的回表扫描行。

所以,建立前缀索引前需要找到区分度最高的前缀。可以通过SELECT COUNT(distinct email(n)) FROM t;计算前缀不同的行数,和表的总行数比较,得到区分度最高的前缀。

索引覆盖失效。比如SELECT id, email FROM t WHERE email = "xxx@163.com",可以使用覆盖索引,但因为索引树只有字符串部分数据,必须回表拿数据,即索引覆盖失效。

字符串区分度不高时

对于只存在字符串的等值查询场景,且整个字符串区分度不高的情况,可以考虑如何建立索引?

存储逆序字符串并建立索引。适用于原始字符串前缀的区分度不高,但字符串末尾区分度高的场景,查询语句为SELECT * FROM t WHERE email = reverse(xxx@163.com)

新建立一列,内容为原始字符串的crc32哈希值,并对哈希值这列建立索引。适用于整个字符串前后部分区分度都不高的场景,查询语句为SELECT * FROM t WHERE crc_col = crc32("xxx@163.com") and email = "xxx@163.com"。因为可能发生哈希冲突,所以需要再比较下字符串值。

注意,前缀索引目的在于节省存储空间,但相应地也增加了开发转换的复杂度和错误的风险。存储资源足够的情况下,建议优先考虑整个字符串索引方式。

参考

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯