mysql 字符串建索引吗_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 = ? ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值