美文网首页我爱编程mysql
mysql长字符串如何建立索引

mysql长字符串如何建立索引

作者: 良人与我 | 来源:发表于2018-12-24 14:47 被阅读40次

    因为业务的需求,难免要对比较长的字段进行匹配查找。
    如果不建立索引就会全表扫描相当耗时。如果为长字符串建立索引浪费空间,性能也比较低。
    那该怎么办呢。这里给出几个方案供参考。
    以身份证字段为例,一般是18位的字符串。
    persion 表如下

    CREATE TABLE `persion` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(100) NOT NULL,
      `car_id` varchar(18) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    方案一

    建立前缀索引,来减少索引的长度

    CREATE TABLE `persion` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(100) NOT NULL,
      `car_id` varchar(18) NOT NULL,
      `crc` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `persion_car_id_idx` (`car_id`(8)) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    但是身份证一般前面几位是有规律的,代表省市区。所以如果以前面几位做索引可能会导致粒度太小了。
    可以将身份证反转 然后存入。

    方案二

    添加个 crc 字段,存储身份证号的时候 存入身份证号的 crc 信息(业务层计算)。

    CREATE TABLE `persion` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(100) NOT NULL,
      `car_id` varchar(18) NOT NULL,
      `crc` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    而查询时候 先查询 crc 匹配后再查询身份证。

    SELECT id, name, car_id
    FROM persion p
    where p.crc = ?
    and p.car_id =  ? ;
    

    相关文章

      网友评论

        本文标题:mysql长字符串如何建立索引

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