MySQL“太多密钥”错误

时间:2009-12-30 11:38:05

标签: mysql ruby-on-rails key indexing

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

To many keys specified; max 64 keys allowed

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

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

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

这种策略是否有任何表现或其他陷阱?

3 个答案:

答案 0 :(得分:2)

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

  

或者我需要重构表格吗?

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

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

答案 1 :(得分:2)

另一种选择 - 将您的布尔值存储为数字字段中的位标记。

e.g。而不是四个字段“true,false,false,true”存储一个数字“9”(二进制1001)。

答案 2 :(得分:1)

将布尔字段分类为组,并为这些组维护单独的表。在查询中进行连接以检索结果。使用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个科目分别制作表格。

如果学生成功通过表格1中的英语科目,请在student_id表格中插入相应的form_1_english。这样,您在该列中只有唯一值,并且该列上的索引将更有效。