zoukankan      html  css  js  c++  java
  • 怎么给字符串字段加索引

    创建完整索引,会占用比较多的空间

    创建前缀索引

    比如需要给用户表的name字段增加索引,取前6字符作为前缀索引,命令是
    alter table user add index idx_name name(6);

    但千万注意,此时创建的name索引无法和主建id组成覆盖索引,
    select name, id from user; 此时必须回表根据id查出记录。

    创建前缀索引时,指定多长的字符,推荐以能覆盖95%以上的数量为宜; 可以这样统计:

    select count (distinct name) as L;
    
    select count( distinct left(name, 4)) as L4,
    count( distinct left(name, 5)) as L5,
    count( distinct left(name, 6)) as L6,
    count( distinct left(name, 7)) as L7
    from user;
    

    以上的L4~L7中,找出不小于L * 95%的值,比如
    6,7 的长度满足覆盖了95%的总数的话,就建立长度为6的前缀索引

    倒序存储和建立hash字段

    前缀索引需要根据能覆盖的总数来建立,如果前缀字符的区分度不高,需要建立更长的字段,这样建立的前缀索引会占用更多空间。

    有两种方式可以解决前缀长度区分度不够的问题

    1. 每次倒序存储,这样反过可以对字符串后几位建立索引,查询时也需要倒过来查询
      select * from user where name = reverse('lisi')
    2. 使用crc32取字符串的hash值,并一并存储,建立索引。
      mysql> alter table t add id_card_crc int unsigned, add index(id_card_crc);
      查询时
      select field_list from t where id_card_crc=crc32("lisi")

    倒叙存储和hash字段,由于对字符串进行了操作,因此无法对其使用区间搜索。

    另外前缀索引由于无法提供完整的字段信息,就用不了覆盖索引的优化了

  • 相关阅读:
    FormsAuthenticationTicket基于forms的验证
    JavaScript:Select标签
    Cookie编程入门篇
    SQL合并多表查询记录的存储过程
    JavaScript动态的为元素添加事件
    根据数据库表名查询该表字段名、字段类型、以及注释
    HttpHandler HttpModule入门篇
    XSLT的处理模型(1)
    jQuery.validate 中文API
    关于程序集生成失败 引用的程序集没有强名称的解决办法
  • 原文地址:https://www.cnblogs.com/linyihai/p/15725533.html
Copyright © 2011-2022 走看看