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 = ? ;