2014-03-30 81 views
0

This post排序,而不是建立索引说:Mysql的Xtradb通过插入

如果你的Percona Server上与XtraDB运行Innodb的插件,你得到一个伟大的新功能的 好处 - 建立由排序指标的能力 而不是通过插入

但是我在这找不到任何信息。我希望能够重组物理表的方式,类似于Postgre CLUSTER命令或MyISAM“alter table ... order by”。例如,表“posts”以随机插入顺序包含数百万行,大多数查询使用“where userid =”,并且我希望表中的行具有属于一个用户在磁盘上物理分隔的位置,以便常见查询需要较低的IO。 XtraDB有可能吗?

+0

不,这是不可能的。 Innodb在聚集索引PRIMARY中存储一个表,该表是一个B +树,主键字段作为键。如果你有一个查询“where userid =?”然后在用户ID上创建一个二级索引。 – akuzminsky

+0

@akuzminsky,是的,但与用户ID二级索引,可能有一个单一的查询,而不是一个数百个Io操作? – Fluffy

回答

0

有关的博客文章

你基本上看功能澄清fast index creation。这个特性加速了向InnoDB表创建二级索引的,但它仅用于非常特殊的情况。例如,OPTIMIZE TABLE不使用该功能,而OPTIMIZE TABLE因此可以通过首先删除索引而显着加速,然后运行OPTIMIZE TABLE,然后使用fast index creation(约为the post you linked)重新创建索引。

这种情况下的某种自动化可以通过手动使用此功能来改善,如was added to Percona Server作为系统变量expand_fast_index_creation。如果激活,服务器应该使用快速索引创建不仅在特定情况下,但在所有情况下它可能会帮助,如OPTIMIZE TABLE - 链接的博客文章中提到的问题。

关于你的问题

你的问题其实是,如果有可能保存在一个自定义的顺序由磁盘上利用当地加快特定类型的查询InnoDB表。

这是不可能的。 InnoDB行根据聚集索引(实际上是主键)保存在页面中。行/页面可能处于混乱排序状态,对此,InnoDB表格可以是OPTIMIZE TABLE。使用这个命令,表格实际上是以主键顺序重新创建的。这允许在相同或相邻页面上收集主键本地行。

这就是你可以强迫InnoDB做的事情。您可以阅读the manual about clustered index,手册中的另一页作为definite answer that this is not possible ("ORDER BY does not make sense for InnoDB tables because InnoDB always orders table rows according to the clustered index.")the same question on dba.stackexchange which answers might interest you