美文网首页mysql
mysql之字符串字段添加索引

mysql之字符串字段添加索引

作者: 每天进步一点点变成更好的自己 | 来源:发表于2022-04-07 12:27 被阅读0次

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

    倒序存储和hash字段索引都不支持范围查询。倒序存储的字段上创建的所有是按照倒序字符串的方式排序的。hash字段的方式也只能支持等值查询。

    1、创建表

    --创建表的时候,创建索引
    mysql> create table SUser(
    ID bigint unsigned primary key,
    email varchar(64), 
    ... 
    )engine=innodb; 
    --没有添加索引,全表扫描
    mysql> select f1, f2 from SUser where email='xxx';
    
    --倒序存储,倒序方式每次读写时,都需要额外调用一次reverse函数
    mysql> select field_list from t where id_card = reverse('input_id_card_string');
    
    --使用hash字段,需要额外调用一次crc32()函数
    mysql> alter table t add id_card_crc int unsigned, add index(id_card_crc);
    
    mysql> select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string'
    

    2、添加索引

    mysql> alter table SUser add index index1(email);:包含了每个记录的整个字符串

    mysql> alter table SUser add index index2(email(6));:-对于每个记录只取前6个字节

    全字段索引操作流程
    使用的是 index1(即 email 整个字符串的索引结构),执行顺序是这样的:
    1、从 index1 索引树找到满足索引值是’zhangssxyz@xxx.com’的这条记录,取得 ID2 的值;
    2、到主键上查到主键值是 ID2 的行,判断 email 的值是正确的,将这行记录加入结果集;
    3、取 index1 索引树上刚刚查到的位置的下一条记录,发现已经不满足 email='zhangssxyz@xxx.com’的条件了,循环结束。

    前缀字段索引操作流程
    如果使用的是 index2(即 email(6) 索引结构),执行顺序是这样的:
    1、从 index2 索引树找到满足索引值是’zhangs’的记录,找到的第一个是 ID1;
    2、到主键上查到主键值是 ID1 的行,判断出 email 的值不是’zhangssxyz@xxx.com’,这行记录丢弃;
    3、取 index2 上刚刚查到的位置的下一条记录,发现仍然是’zhangs’,取出 ID2,再到 ID 索引上取整行然后判断,这次值对了,将这行记录加入结果集;
    4、重复上一步,直到在 idxe2 上取到的值不是’zhangs’时,循环结束。

    倒序查询和hash字段的区别
    它们的区别,主要体现在以下三个方面:
    1、从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。当然,倒序存储方式使用 4 个字节的前缀长度应该是不够的,如果再长一点,这个消耗跟额外这个 hash 字段也差不多抵消了。
    2、在 CPU 消耗方面,倒序方式每次写和读的时候,都需要额外调用一次 reverse 函数,而 hash 字段的方式需要额外调用一次 crc32() 函数。如果只从这两个函数的计算复杂度来看的话,reverse 函数额外消耗的 CPU 资源会更小些。
    3、从查询效率上看,使用 hash 字段方式的查询性能相对更稳定一些。因为 crc32 算出来的值虽然有冲突的概率,但是概率非常小,可以认为每次查询的平均扫描行数接近 1。而倒序存储方式毕竟还是用的前缀索引的方式,也就是说还是会增加扫描行数。

    相关文章

      网友评论

        本文标题:mysql之字符串字段添加索引

        本文链接:https://www.haomeiwen.com/subject/gqrjsrtx.html