MySQL 根据列的最后两位数进行分区

MySQL partitions based on last two digits of a column

如果我有一个包含 1 亿条记录的数据库,并且希望用尽可能少的时间进行搜索!

CREATE TABLE `my_table` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
`number` BIGINT(12) NOT NULL,
`name` VARCHAR(50) NOT NULL,
`address` VARCHAR(150) NOT NULL,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `my_table_u` (`id` ASC, `number` ASC) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

它有这样的数据

(1, 981776166221,'name1','address1')
(2, 499383722122,'name2','address2')
(3, 983765018762,'name3','address3')
(4, 986544567897,'name4','address4')
(5, 990876544335,'name5','address5')

并且我将搜索numbernumber字段是任意数字,由12位数字组成XXXXXXXXXXXX

我正在考虑通过做 100 个分区来做 MYSQL partitioning,每个带有 number 归档的记录以精确的两位数结尾,如下所示:-

p1 (ends with 01), 
p2 (ends with 02), 
p3 (ends with 03),
..,
p45 (ends with 45),
..,
p99 (ends with 99)

所以如果我要搜索 number = 765372819827 可能很明显它将在分区 27 内搜索,因为最后两位数是 27.

它真的能让搜索变得更快吗?

我如何 以这种方式设置分区(仅基于 number 字段的最后两位数)?

我建议在 number 上创建一个索引(如果它是唯一索引),应该就是这样。

(id, number) 上现有的唯一索引没有意义,因为 id 本身就是一个唯一键。此外,MySQL 不能将其用于 WHERE number = ...,因为 number 存储在叶节点上。

(答案的开头。)

PARTITIONing 是可能的,但它不太可能加快您的查询速度。由于转换 table 是一项繁重的工作,让我们讨论其他提高性能的方法。请提供一些“搜索”查询的示例。从那里,我也许可以就更好的索引提出建议。如果没有,我会建议如何最好地使用分区。

如果 number = 765372819827 是唯一的“搜索”,那么 INDEX(number) 只需将查询从“检查 1 亿行”更改为“检查 1 行”即可解决您的问题。

然后放下 my_table_u