Big mysql innodb table - 如何优化和分区
Big mysql innodb table - how optimize and partitioning
有一个table Mysql InnoDB:
- table包含22列,其中一部分可能是NULL
- 第一列
phone
是 必需的,并且始终包含 phone 个 10 位数字(任意)。
- 列
phone
不唯一,可以是包含相同 phone 的多个不同字符串
- table 是 static 并且不假定添加行
- table 的大小接近 5 亿行
如何通过 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)
。
有一个table Mysql InnoDB:
- table包含22列,其中一部分可能是NULL
- 第一列
phone
是 必需的,并且始终包含 phone 个 10 位数字(任意)。 - 列
phone
不唯一,可以是包含相同 phone 的多个不同字符串
- table 是 static 并且不假定添加行
- table 的大小接近 5 亿行
如何通过 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)
。