【问题标题】:Mysql partition indexingMysql分区索引
【发布时间】:2012-11-14 17:49:13
【问题描述】:

我想从批处理数据中创建一个表以进行数据挖掘。我每天将有大约 2500 万行数据进入这个表。表上定义了几个索引,所以插入(我做批量插入)速度很慢。如果没有索引,我可以粘贴 40K 行,而使用索引则更像是 3-4 K,这使得整个事情变得不可行。所以想法是按天对数据进行分区,禁用键,然后进行当天的插入,然后重新启用索引。对一天的数据重新启用索引需要 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 

目前没有分区。

【问题讨论】:

  • 您当前的表结构是什么? (SHOW CREATE TABLE your_table的输出)

标签: mysql indexing partitioning


【解决方案1】:

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

考虑加载新数据的场景:

  1. 创建一个临时表,定义您需要的所有分区
  2. 在没有索引的情况下将数据加载到临时表中。
  3. 在此表上创建索引。
  4. 将分区移动到目标表,该表的分区与临时表相同。
  5. 在临时表上删除索引

要以可控的方式对现有数据进行分区,您可以使用相同的逻辑将数据移动到新的分区表。

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多