Big mysql innodb table - 如何优化和分区

Big mysql innodb table - how optimize and partitioning

有一个table Mysql InnoDB:

如何通过 table 上的 phone 优化 SELECT?分区有帮助吗?

如果您的数据(phone 数字)均匀分布,分区将很有用。 10个分区和90%的数据在第一个是没用的...

首先,如果您真的应该使用分区,那么最好是 RANGE 以避免 HASH 的开销,但它有缺点:

Phone 数字通常包含一些结构(国家代码、区号...),这使得按 RANGE 划分是有偏差的估计。

如果你有可能,我建议的是 (1) 以 reverse 顺序(从右到左)存储和索引 phone 数字因此最后一位数字排在最前面,这更有可能均匀分布。

然后,(2) 如果可以的话,我会根据需要拆分尽可能多的 table(一开始是 10 个),数字以第 X 个数字开头。因此,这会将每个 table 中的行数限制为数据的一个子集。

在服务器配置上,按 table 存储 innodb 数据,这有助于并发索引。

当然,以上仅适用于您的模式具有一定灵活性并且不需要运行 对整个数据集进行合并查询的情况。

PARTITIONing 不会 帮助;它可能会减慢访问速度。相反,在 phone.

上有一个非唯一的 INDEX

更好的是,如果有一个PRIMARY键或其他UNIQUE键,则将PRIMARY KEY更改为phone开始

如果当前 PK 是 AUTO_INCREMENT id,则将其降级为 INDEX(id)

有许多警告和变化。如需进一步讨论,请提供SHOW CREATE TABLE和常用的SELECT(s)