簡體   English   中英

在MySQL數據庫設計中,有數百萬個表和數百萬行是常見的做法嗎?

[英]is having millions of tables and millions of rows within them a common practice in MySQL database design?

我正在為即將推出的網絡應用程序進行數據庫設計,如果這種設計對於一個Web應用程序來說很有效,那么我很想在當前的網絡應用程序中大量使用mysql。

1個DB

在DB中,數百萬個表用於每個用戶的功能,並且在每個表中,可能有數百萬行。

雖然這個設計很有活力並且很好地擴展,但我想知道兩件事。

  1. 這是當今Web應用程序中的常見設計嗎?
  2. 如果查詢數百萬行,這將如何執行,時間明智。
  3. 如果數據庫包含數百萬個表,它如何執行? (再次,時間明智,這甚至可能嗎?)
  4. 如果它在上述條件下表現良好,如果所有80,000個用戶每天訪問數據庫20-30次,每天10-15分鍾會話,它如何在劇烈負載下運行?
  5. 一般來說,這需要多少服務器空間(重申,數百萬個表,每個表包含數百萬行,10-15列填充文本)

任何幫助表示贊賞。

1 - 絕對不是。 幾乎所有你問過的人都會告訴你數以百萬計的表是一個糟糕的主意。

2 - 數以百萬計的ROWS很常見,所以很好。

3 - 可能非常糟糕, 特別是如果查詢是由認為可以擁有數百萬個表的人編寫的 這告訴我,這是一個不太了解數據庫的人。

4 - 見#3

5 - 無法分辨。 您將從額外的表中獲得大量額外開銷,因為它們都需要額外的元數據。 所需空間將取決於索引以及表格的寬度以及許多其他因素。

簡而言之,這是一個非常非常非常糟糕的想法,你不應該這樣做。

數百萬行是完全正常的使用,如果適當優化和索引,可以快速響應。

數以百萬計的表格表明您已經在如何構建應用程序方面做了大量工作。 數百萬行乘以數百萬個表,80,000個用戶意味着什么,80萬億記錄? 我強烈懷疑你有那么多數據。

在表中擁有數百萬行是完全正常的,只要您使用適當的索引,MySQL就可以輕松處理這一問題。

另一方面,擁有數百萬張桌子似乎是一個糟糕的設計。

如果您正在考慮擁有數百萬個表,我無法想象您實際上是在設計數百萬個邏輯上不同的表。 相反,我強烈懷疑你是根據數據動態創建表。 也就是說,而非創造條件,比方說用戶ID的字段,以及存儲一個或多個記錄每個用戶,你正在考慮為每個用戶ID創建新表。 然后,您將擁有成千上萬的表,這些表中的字段完全相同。 如果這就是你要做的事:不要。 停止。

表應表示要為其存儲數據的邏輯TYPE。 您可以創建一個城市表,然后為每個城市創建一條記錄。 城市表中的一個字段可能表示該城市所在的國家/地區。請勿為每個國家/地區的所有城市創建單獨的表格。 法國和德國都是“國家”的例子,應該在同一張桌子上。 它們不是不同的東西,法國東西和德國東西。

這是要問的關鍵問題:我想在每條記錄中保留哪些數據? 如果您有1,000個表都具有完全相同的列,那么幾乎可以肯定這應該是一個具有1,000個可能值的字段的表。 如果你真的非常認真地保留關於法國的信息而不是關於德國的信息,就像法國一樣,你想要一份有首都和人口的省份列表,但對於德國,你想要一份有工業和董事會主席的公司名單,那么好吧,那應該是兩個不同的表。 但在那一點上,差異可能不是法國與德國,而是其他東西。

除了別人所說的,不要忘記根據給定的表名找到合適的表也需要時間。 多少時間? 嗯,這是DBMS內部的,可能沒有記錄,但可能比您想象的要多。

因此,搜索行的查詢可以采取:

  1. 是時候找到表+時間來查找(相對)小表中的行。
  2. 或者 ,只是在一個大表中找到一行的時間。

(2)可能更快。

此外,在查詢中經常使用不同的表名會使查詢准備工作變得不那么有效。

1]查找數據庫設計中的維度和事實表。 您可以從http://en.wikipedia.org/wiki/Database_model#Dimensional_model開始。

2]注意索引太多:對於高寫/更新你不想索引太多,因為它變得非常昂貴(想想平均情況或平衡b樹的最壞情況)。 對於高讀表,僅索引您搜索的字段。 例如在

select * from mutable where A ='' and B='';

您可能想要索引A和B.

3]可能沒有必要開始考慮復制。 但既然你在談論10 ^ 6個條目和表格,也許你應該這樣做。

所以,而不是我告訴你一個數百萬的表問題(並且是的,我的答案是否定的),我認為一點研究將更好地為你服務。 至於數百萬條記錄,它暗示你需要開始考慮“向外擴展” - 而不是“擴大規模”。

SQL Server有許多方法可以支持大型表。 您可以通過在多個分區(文件組)之間拆分索引,在自己的文件組中放置大表以及在另一組文件組上放置大表的索引來找到一些幫助。

文件組基本上是一個單獨的驅動器。 每個驅動器都有自己專用的讀寫頭。 驅動器越多,一次搜索索引的頭越多,因此查找記錄的結果越快。

這是一個詳細討論文件組的頁面。

http://cm-bloggers.blogspot.com/2009/04/table-and-index-partitioning-in-sql.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM