我爱编程mysql

mysql长字符串如何建立索引

2018-12-24  本文已影响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 =  ? ;
上一篇下一篇

猜你喜欢

热点阅读