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')
并且我将仅搜索number
和number
字段是任意数字,由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
。
如果我有一个包含 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')
并且我将仅搜索number
和number
字段是任意数字,由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
。