【问题标题】:MySQL 'Too many keys' errorMySQL“键太多”错误
【发布时间】:2010-12-31 02:04:27
【问题描述】:

我正在 Rails 中创建一个 MySQL 表,它有大约 170 个布尔字段,每个字段都需要可搜索并因此被索引,但是当我创建索引时,我收到错误消息:

To many keys specified; max 64 keys allowed

这个限制是硬编码的还是有一个我可以翻转的配置开关可以绕过它?

或者我需要重构表格吗?对我来说显而易见的方法是将多个表连接在一起并运行查询,例如

Table.find.all(:conditions => "join1.fieldx = true and join2.fieldy = true")

这种策略有什么表现或其他问题吗?

【问题讨论】:

  • 非常很想知道什么需要这样的 170 个布尔字段...
  • 我非常非常想知道这样一个表的谓词是什么。

标签: mysql ruby-on-rails key indexing


【解决方案1】:

显然,目前唯一的方法是增加源代码中MAX_KEY 的值并重新编译MySQL。 (Source)

或者我需要重构表格吗?

可能是的。除了键多的问题外,索引布尔列并不是特别有益。 B-tree 索引对于高基数数据(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的)最有效。

如果您必须坚持这种设计,我认为您可能需要考虑将布尔列保留为非索引且没有任何外键约束。

【讨论】:

    【解决方案2】:

    另一种选择 - 将布尔值作为位标志存储在数字字段中。

    例如而不是四个字段“真,假,假,真”存储一个数字“9”(二进制1001)。

    【讨论】:

    • 我同意位标志对于某些应用程序来说非常棒。但是在位标志中搜索特定开关的效率如何?
    • 效率不高。这完全取决于表是否将容纳 100 行或 100k。
    【解决方案3】:

    将布尔字段分类为组,并为这些组维护单独的表。在查询中进行连接以检索结果。使用 EXPLAIN EXTENDED SELECT 优化查询的索引。

    另外,尽量维护覆盖索引,因为 MySQL 每个表只使用一个索引。

    http://www.mysqlperformanceblog.com/2009/06/05/a-rule-of-thumb-for-choosing-column-order-in-indexes

    编辑 01:

    正如丹尼尔在他的回答中提到的,布尔值的索引基数对您没有任何帮助。当您对此类列使用索引时,有时情况会变得更糟。

    您可以使用 170 个表来引用父数据的主键,而不是使用 170 个布尔列。

    假设您的父表是students,主键是student_id

    为他们在学龄时学习的 170 门科目分别设置表格。

    如果学生成功通过了 Form 1 中的英语科目,请在 form_1_english 表中插入适当的 student_id。这样一来,您在该列中只有唯一值,并且该列上的索引会更加高效。

    【讨论】:

    • 感谢 Nirmal,这看起来是一个非常好的重构想法。
    猜你喜欢
    • 2011-06-28
    • 2010-11-15
    • 2017-10-29
    • 1970-01-01
    • 2015-03-24
    • 2013-05-07
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多