Mysql分区索引

时间:2012-11-14 17:49:13

标签: mysql indexing partitioning

我想从批处理数据中创建一个表来进行数据挖掘。我每天将有大约2500万行数据进入此表。表上定义了几个索引,因此插入(我的批量插入)速度非常慢。没有索引我可以坚持40K行,而索引更像是3-4K,这使得整个事情变得不可行。因此,我们的想法是按天划分数据,禁用密钥,然后进行当天的插入,并重新启用索引。重新启用一天数据的索引需要20分钟,这很好。这让我想到了我的问题。当您重新启用索引时,它是否必须重新计算所有部分的索引,或者只是为了那一天?很明显,对于分区所在的索引(在这种情况下是日期),它应该仅适用于那一天。但其他指数怎么样?如果需要重新计算所有分区的索引,则无法在合理的时间内完成。有谁知道吗?

显示创建是这样的:

sts | CREATE TABLE `sts` (
`userid` int(10) unsigned DEFAULT NULL,
`urlid` int(10) unsigned DEFAULT NULL,
`geoid` mediumint(8) unsigned DEFAULT NULL,
`cid` mediumint(8) unsigned DEFAULT NULL,
`m` smallint(5) unsigned DEFAULT NULL,
`t` smallint(5) unsigned DEFAULT NULL,
`d` tinyint(3) unsigned DEFAULT NULL,
`requested` int(10) unsigned DEFAULT NULL,
`rate` tinyint(4) DEFAULT NULL,
`mode` varchar(12) DEFAULT NULL,
`session` smallint(5) unsigned DEFAULT NULL,
`sins` smallint(5) unsigned DEFAULT NULL,
`tos` mediumint(8) unsigned DEFAULT NULL,
PRIMARY KEY (userid, urlid, requested),
KEY `id_index` (`m`),
KEY `id_index2` (`t`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

目前尚未对其进行分区。

1 个答案:

答案 0 :(得分:0)

您在上禁用/启用索引。这意味着将在表的所有部分上禁用/启用索引。

考虑加载新数据的这种情况:

  1. 创建一个定义所有需要的分区的临时表
  2. 将数据加载到没有索引的登台表中。
  3. 在此表上创建索引。
  4. 将分区移动到目标表,该目标表的分区与登台表相同。
  5. 在登台表上删除索引
  6. 要以可控制的方式对现有数据进行分区,您可以使用相同的逻辑将数据移动到新的分区表。