mysql实战45讲学习笔记--11

11 怎么给字符串字段加索引

        前缀索引的优势,选取字段前几个作为索引,占用的空间更小
        使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。
        建立索引的时候关注的是区分度,区分度越高越好,区分度越高,意味着重复的键值越少,因此,可以通过统计索引上有多少不同的值来判断使用多长前缀。
        mysql> select count(distinct email) as L from SUser;
        然后选取不同长度的前缀来看这个值,
        mysql> 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;
        使用前缀索引可能会损失区分度。
        使用前缀索引的时候就用不上覆盖索引对查询性能的优化,这也是选择是否使用前缀索引需要的考虑因素。
        实际情况可以根据区分度来看使用什么存储,
        倒序存储和使用hash字段的异同点
        从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。当然,倒序存储方式使用4个字节的前缀长度应该是不够的,如果再长一点,这个消耗和额外这个hash字段差不多抵消。
        CPU消耗方面,倒序方式读和写的时候,需要额外调用一次reverse函数,而hash字段的方式需要额外调用一次crc32()函数,如果从两个函数的计算复杂度来看,reverse函数额外消耗的CPU资源会更小些。
        查询效率来看,使用hash字段方式的查询性能相对稳定一些。因为crc32算出来的值虽然有冲突的概率,但概率非常小,可以认为每次查询的平均扫描行数接近1。

小结

        使用字符串创建索引的场景
        1.直接创建完整索引,这样可能比较占用空间,
        2.创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引
        3.倒序存储,在创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题。
        4.创建hash字段索引,查询性能稳定,有额外的存储和计算消耗,都不支持范围扫描。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值