2009-12-30 117 views
1

我在Rails中創建了一個具有大約170個布爾字段的MySQL表,每個表都需要被搜索並因此編入索引,但是當我創建索引時,我收到錯誤消息:MySQL'太多密鑰'錯誤

To many keys specified; max 64 keys allowed 

這是限制硬編碼還是有配置開關我可以翻轉哪一個沃爾德繞過它?

或者我需要重構表嗎?對我來說最顯而易見的方法看起來是聯合多個表和運行這樣一個查詢作爲

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

是否有任何性能或其他陷阱這樣的戰略?

+3

我非常*好奇地知道需要170個布爾字段嗎? – 2009-12-30 11:43:12

+0

我很*好奇地知道這個表的*謂詞是什麼。 – 2009-12-30 12:00:53

回答

1

將布爾字段分類爲組,併爲這些組維護單獨的表。在您的查詢中加入連接以檢索結果。使用EXPLAIN EXTENDED SELECT來優化查詢的索引。

此外,請嘗試維護覆蓋索引,因爲MySQL每個表只使用一個索引。

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

編輯01:

正如丹尼爾在他的回答中提到,布爾值,指數cardianality是不會幫你的任何方式。在某些情況下,當您爲這些列使用索引時會變得更糟。

代替使用170個布爾列,則可以使用170個表參照父數據的主鍵。

假設您的父表爲students,主鍵爲student_id

有170個科他們在學齡進行單獨的表。

如果學生成功通過表格1中的英語科目,請在form_1_english表中插入相應的student_id。這樣,您在該列中只有唯一的值,並且該列上的索引將更加高效。

+0

感謝Nirmal,這對於重構來說看起來非常整齊。 – 2009-12-30 17:01:23

2

顯然目前唯一的方法是在源代碼中增加MAX_KEY的值並重新編譯MySQL。 (Source

或者我是否需要重構表?

可能是的。除了許多鍵的問題之外,索引布爾列並不是特別有利的。對於高基數數據(即具有許多可能值的列,其中列中的數據是唯一的或幾乎唯一的),B樹索引是最有效的。

如果你必須堅持這個設計,我想你可能要考慮離開布爾列非索引,沒有任何外鍵約束。

2

另一種選擇 - 存儲您的布爾在許多領域的位標誌。

例如而不是四個字段「真,假,假,真」存儲一個數字「9」(二進制1001)。

+0

我同意位標誌對於某些應用程序來說很棒。但是在特定開關的位標誌內搜索效率如何? – Nirmal 2009-12-30 12:16:23

+0

效率不高。這一切都取決於表格將保持100行,還是100k。 – 2009-12-30 12:18:29