要索引的列太多 - 使用mySQL分区?

时间:2010-12-13 13:19:16

标签: database-design mysql partitioning database-partitioning

我们有一个应用程序,其中包含20个以上列的表,这些列都可以搜索。为所有这些列构建索引会使写入查询变得非常缓慢;并且任何真正有用的索引通常必须跨越多个列,增加所需的索引数量。

但是,对于这些搜索中的95%,只需搜索这些行中的一小部分,而且数量非常少 - 比如50,000行。

因此,我们考虑使用mySQL分区表 - 具有基本上isActive的列,这是我们将两个分区除以的。大多数搜索查询都会使用isActive=1运行。然后,大多数查询将针对小的50,000行分区运行,并且在没有其他索引的情况下快速运行。

唯一问题是isActive=1未修复的行;即它不是基于行的日期或类似的任何固定的;我们需要根据该行中数据的使用情况更新isActive。据我所知,这不是问题;在UPDATE查询期间,数据只会从一个分区移动到另一个分区。

我们确实在行PK上有一个id;我不确定这是不是一个问题;手册似乎暗示分区必须基于任何主键。这对我们来说是一个巨大的问题,因为主键ID没有依据行isActive

4 个答案:

答案 0 :(得分:7)

答案 1 :(得分:1)

如果要为很多“列”编制索引,您可能需要重新考虑数据结构。例如,将每列设为行/记录。然后有一个“组ID”将各个记录链接在一起,并有一个“名称”字段来表示它是什么数据。那么您只需要1个索引即可获得所有数据。

这个名称/值对设置现在实际上相当普遍,并且是一些noSQL数据库所基于的。这是您可能想要研究的其他内容。像MongoDB这样的东西非常适合索引“所有”数据。

答案 2 :(得分:0)

您不需要分区 - 仅isActive列上的索引就足够了。请注意,MySQL可以使用Index Merge操作来使用这两个索引。

分区在允许并行执行搜索时非常有用:例如,如果您按日期分区,则可以同时搜索5个分区以查找跨越5年的结果。

答案 3 :(得分:-2)

您对“表格”和“数据库”的描述是缺乏规范化的典型症状。具有20个可搜索列的“表”不是3NF,甚至可能不是1NF。最好的建议是回到第一原则,并规范化数据,这将导致更窄的表,并且每个表的行数也更少,但肯定是mote表。但是,结果也有更少的索引,每个表和整体。

更快的数据库。在各个层面上,胖子“桌子”都是表演的灾难。

分区在这里不适用,它们不会缓解您的问题。

id PK是附加索引,是真实主键的替代品,替代品(但不是替代品)。如果您使用关系建模技术,那么可以消除,至少可以达到19个可搜索的索引。任何关于“桌子”的认真工作都将以真正的PK为中心,而不是代理人,例如,你从限制分区看到的。

如果您想讨论它,请将您的DDL发布到“表格”,以及每个连接的“表格”。

对评论的回应

  

该表最好被认为是“电子邮件”,但有许多额外的字段(类别/部门/优先级/工作流程/所有者)都已正确规范化。还有一系列其他变量,包括很多时间戳。

这是平面文件的定义,在 0NF 。除非您使用“标准化”的一些不成文的定义,否则根据您自己的描述,根本不是标准化。这是在任何规范化开始之前开始的文章。

  • 毫无疑问,这些指数也会在整个范围内发挥作用,以便对查询有用。

  • 您可能还没有意识到,该文件中存在大量数据重复,并且更新异常(当您更新一行中的列时,您必须更新其他行中的重复值),使您的应用程序变得不必要地复杂。

您需要了解所有 Relational DBMS供应商都会编写 Relational 数据库引擎,这些数据库引擎经过优化以处理 Relational 数据库。这意味着它们针对规范化而非非规范化或非规范化结构进行了优化。

我不会被吸引到学术论点,而且SO是问答网站,而不是辩论网站。根据要求,发布您的DDL文件和所有连接文件,我们绝对可以(a)给它一些速度和(b)避免20多个索引(这是条件的另一个常见症状)。这将解决一个特定的现实世界问题并解决它,并避免争论。

其次,你似乎把角色搞砸了。问题就是你,在SO上发布问题,而且我已经修复了数百个性能问题并回答了问题。根据定义,解决方案在您的域之外,否则您将解决它,因此您不会发布问题;所以当你告诉我如何解决你的问题时它不起作用。这会让我陷入与你所拥有的相同的限制中,从而确保我不解决问题。

  

同样来自我们的测试,我们需要在WHERE子句中包含大量的JOIN表,只会使查询变慢。

实际上我调整数据库是为了生活,我有数百个测试证明加入许多更小的表更快。研究编码器的测试和编码能力会很有趣,但这会引起争论,所以我们不要这样做;让我们坚持这个问题。如果你想要(a)严格测试的例子(b)证明我在被质疑之前所说的内容,这里只是one example完全记录并在Oracle世界中对stalwarts进行详细记录和相应的测试。

你可能也对这个question/answer感兴趣,这会扼杀你正在接近的辩论。

加入任何费用。您加入的文件;和任何一方加入的记录数量;指数的有用性,即成本所在的位置。如果它是另一个Unnormalised文件(胖,宽,许多可选列),确定它会很慢。

无论如何,如果您真的对修复已发布的问题感兴趣,请发布所有DDL,我们可以让您更快地完成。如果您想要的是一个是/否答案重新分区(并且不解决因果关系问题),那也没关系;你已经拥有了。