首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL 'Too many‘错误

问MySQL 'Too many‘错误
EN

Stack Overflow用户
提问于 2009-12-30 19:38:05
回答 3查看 1.3K关注 0票数 1

我在Rails中创建了一个MySQL表,其中包含大约170个布尔值字段,每个布尔值字段都需要是可搜索的,因此是可索引的,但是当我创建索引时,我得到了错误消息:

代码语言:javascript
复制
To many keys specified; max 64 keys allowed

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

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

代码语言:javascript
复制
Table.find.all(:conditions => "join1.fieldx = true and join2.fieldy = true")

这样的策略是否存在性能或其他方面的问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-30 19:58:37

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

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

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

编辑01:

正如Daniel在他的回答中提到的那样,布尔值的指数心脏性对您没有任何帮助。有时,当您对这些列使用索引时,情况会变得更糟。

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

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

有170个单独的表,他们在他们的上学年龄承担的科目。

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

票数 1
EN

Stack Overflow用户

发布于 2009-12-30 19:43:39

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

,或者我需要重构这个表吗?

可能是吧。除了存在许多键的问题之外,对布尔列进行索引也没有什么特别的好处。B树索引对于高基数数据(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的)最有效。

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

票数 2
EN

Stack Overflow用户

发布于 2009-12-30 20:06:08

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

例如,代替四个字段"true,false,false,true“,存储一个数字"9”(二进制为1001)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1979737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档