2012-09-28 21 views
1

我讀過more nuanced responses到多少列是太多的問題,想請教一個跟進。計算並減少行的大小來解決有效的MySQL列的限制

我繼承了一個相當混亂的項目(一個調查框架),但人們可以說,數據庫的設計實際上是正確的正常化,即一個人真的有因爲有問題的許多屬性。
我不會捍衛這一概念的爭論,但更迫切的一點是,我的時間很有限,我想幫助這個框架了,我能想到的最快的修復程序的用戶現在正在降低行大小。我懷疑我有能力在我有的時候改變數據庫模型。

列號現在是4661,但他們可以將它有望降低到至少3244,大概少(通過減少的問題,實際數量)。 硬性列限制是4096,但現在我甚至沒有成功添加2500列,可能是因爲行大小限制是65,535字節。

然而,當我計算我行的大小我最終值低得多,因爲幾乎所有的列是TINYINTs(調查答覆範圍從1-12)。 它甚至不適用於2000 TINYINTs(an example query that fails)。

使用formula given in the documentation我得到4996個字節或更少。

column.lengths = tinyints * 1 
null.columns = length(all.columns) 
variable.lengths.columns = 0 
(row.length = 1+ 
    (column.lengths)+ 
    (null.columns + 7)/8+ 
    (variable.lengths.columns) 
) 
## 4996 

在行長計算中我誤解了些什麼?

+0

你的專欄是'question_1','question_2' ...或類似的東西?在其他表格的「問題」中提取這些列,並將其與M:M關係與「人員」表格鏈接起來。在'MySQL'中,你可以把這個表與第三個表'person_question_link'('link_id','person_id','question_id')聯繫起來 – doktorgradus

+0

@dokt謝謝你,但是我沒時間了,恐怕。我很樂意做到這一點,但我正在尋找一個快速解決方案。我也想知道爲什麼我超出了行大小/列數限制。 – Ruben

+0

爲了避免這樣做,我幾乎傷害了任何人,但是一個「修復」將會是一個多值的專欄。 –

回答

1

我忽略了這paragraph

因此,使用長列名可以減少 的最大列數,如可以包含ENUM或SET列,或使用的列 或表意見。

我有很長的列名,用連續的數字替換它們讓我有更多的列(約2693),我將不得不看看增加是否足夠。我不知道他們是如何保存的,大概是字符串,所以也許我可以用字母進一步減少它們。