mysql长字符串如何建立索引

因为业务的需求,难免要对比较长的字段进行匹配查找。
如果不建立索引就会全表扫描相当耗时。如果为长字符串建立索引浪费空间,性能也比较低。
那该怎么办呢。这里给出几个方案供参考。
以身份证字段为例,一般是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 =  ? ;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。