大mysql innodb表 - 如何优化和分区

时间:2016-12-20 00:06:27

标签: mysql innodb

有一个表Mysql InnoDB:

  • 该表包含 22列,其中一部分可能 NULL
  • 第一栏phone 必需,并且始终包含10位数字(任意)的电话号码。
  • phone 不唯信,可以是多个包含同一部手机的不同字符串
  • 该表格为静态,并且不会假设添加行
  • 表格大小接近5亿行

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

2 个答案:

答案 0 :(得分:1)

如果您的数据(电话号码)分布均匀,则分区将非常有用。在第一个分区中有10个分区和90%的数据是没用的......

首先,如果你应该使用分区,理想的是RANGE可以避免HASH的开销,但它有缺点:

电话号码通常包含一些结构(国家代码,区号,......),这使得RANGE的分区成为偏差估计。

如果您有可能,我会建议:(1)以反向顺序(从右到左)存储和索引电话号码,因此最后的数字将首先出现更有可能统一分配。

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

在服务器配置中,存储每个表的innodb数据,这有助于使用并发进行索引。

当然,只有在架构中具有一定的灵活性且不需要针对整个数据集运行整合查询时,上述内容才适用。

答案 1 :(得分:1)

PARTITIONing 帮助;它可能会减慢访问速度。相反,INDEX上有一个非唯一的phone

更好的是,如果PRIMARY密钥或其他UNIQUE密钥,请将PRIMARY KEY更改为 start phone

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

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