因為業(yè)務的需求跪妥,難免要對比較長的字段進行匹配查找。
如果不建立索引就會全表掃描相當耗時眉撵。如果為長字符串建立索引浪費空間落塑,性能也比較低芜赌。
那該怎么辦呢。這里給出幾個方案供參考缠沈。
以身份證字段為例洲愤,一般是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;
但是身份證一般前面幾位是有規(guī)律的,代表省市區(qū)肛宋。所以如果以前面幾位做索引可能會導致粒度太小了酝陈。
可以將身份證反轉(zhuǎn) 然后存入毁涉。
方案二
添加個 crc 字段,存儲身份證號的時候 存入身份證號的 crc 信息(業(yè)務層計算)穆壕。
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 = ? ;