2010-12-06 38 views
0

使用PHP,我構建的應用程序是MySQL數據庫資源沉重,但我也需要它的數據非常靈活。目前有很多表格有不同列的數組(包括一些文本,longtext,int等),並且在將來我想擴展這些表的列數,每當有新的數據組需要。MySQL數據庫結果與表中的列數相比會減慢嗎?

我的問題是,如果我有一個包含10列的表,並且將來將其擴展到40列,SQL查詢(通過PHP)會顯着減慢嗎?

只要查詢最初的10列的初始小查詢不是SELECT-all(*)查詢,我想知道是否使用更多資源或處理,因爲源表是現在要大得多。

此外,由於許多列現在始終保持爲NULL值(例如,只要插入僅需要前10列的新條目),數據庫通常會運行得更慢還是更大?

+0

關於靈活的數據倉庫,您可能會對此SO問題感興趣:http://stackoverflow.com/questions/3455168/case-studies-or-examples-of-high-throughput-services-with-highly-dynamic -data – cbednarski 2010-12-06 04:41:19

回答

1

出於各種原因,MyISAM和InnoDB在這方面的行爲有所不同。例如,InnoDB將爲磁盤上的每一列分配磁盤空間,而不管其中是否有數據,而MyISAM將壓縮磁盤上的表。在有大量空列的情況下,InnoDB將浪費大量空間。另一方面,InnoDB會執行行級鎖定,這意味着(對於注意事項)對同一個表的併發讀/寫操作會更好(MyISAM在寫入時執行表級鎖)。

一般來說,在一張表中有很多列可能不是一個好主意,特別是出於波動性原因。例如,在InnoDB(也可能是MyISAM?)中,重新安排列或更改列的類型(即varchar 128 - >varchar 255)需要將右側列中的所有數據移動到磁盤上以使(或刪除)更改列的空間。

對於您的整體數據庫設計,最好儘可能多地設置爲not null,這樣可以節省空間(您不需要列上的空標誌,也不會存儲空數據)並且還增加查詢和索引性能。如果許多記錄將特定列設置爲null,則應該將其移至外鍵關係並使用JOIN。這樣,磁盤空間和索引開銷只會發生在實際存儲信息的記錄上。

0

優化不是一個瑣事問題。沒有什麼可以預測的。

一般來說,簡短的回答是:是的,它會變慢(因爲DBMS至少需要從磁盤讀取數據併發送更多數據)。

但是,它是非常依賴於每個特定情況會有多慢。你甚至可以看不到差異,或者慢10倍。

0

很可能,不,它不會顯着減慢。

但是,最好問的問題是:添加更多字段的哪種方法會產生更優雅,易於理解,可維護且成本有效的解決方案?

通常答案是「這取決於」。這取決於數據的訪問方式,需求如何改變,數據如何更新以及表的增長速度。

1

可能最好的解決方案是在必要時創建一個帶有附加字段和表格的新表格。原始表格保持不變,保持速度,但仍可以進入額外的領域。

-1

你可以將一個主表分成多個TRANSACTION表,這樣你就會比現在得到更快的結果。並且還使主鍵UNIQUE KEY也在所有事務以及主表中。它確實可以幫助您更快地進行查詢。

謝謝。

相關問題