2014-01-22 42 views
7

我正在構建一個程序,用於存儲來自各種來源的公司及其時間戳的新聞標題。許多表或行,哪一個在SQL中更高效?

假設公司數爲1000它去像蘋果,谷歌,微軟等..

所以,我能想到的兩種選擇。

  1. 一張有很多行的表(上面的代碼只是一個例子)。

    CREATE TABLE news 
    (
        news_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
        company VARCHAR(10) NOT NULL, 
        timestamp TIMESTAMP NOT NULL, 
        source TEXT NOT NULL, 
        content TEXT NOT NULL, 
        ... 
    ) 
    
    // I also can make company and timestamp as primary keys, 
        and news_id will be unique key.* 
    
  2. 1000表

    CREATE TABLE news_apple // and news_google, news_microsoft, news_...(x 1000) 
    (
        news_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
        timestamp TIMESTAMP NOT NULL, 
        source TEXT NOT NULL, 
        content TEXT NOT NULL, 
        ... 
    ) 
    

大多數時候,我會發現某一公司的消息。假設每家公司有超過10000條新聞。我想知道,如果我在第一個選項中使用'WHERE'子句,它將比第二個選項慢。

哪一個在性能方面更高效,爲什麼?

+8

更多行。這就是關係數據庫的設計目的。具有相同結構的多個表通常是不良設計的標誌。 –

+0

您是否考慮過基於nosql的解決方案? – theMayer

+0

@GordonLinoff你能給我更詳細的解釋嗎? – KimchiMan

回答

12

關係數據庫旨在爲每個表存儲多行。還有一大堆的機制,以促進大表,如:對字段的任意組合

  • 索引,以加快搜索
  • 頁面緩存等等常用頁保留在內存
  • 垂直分區(柱狀數據庫),以進一步速度請求
  • 高級算法,例如散列連接和分組依據(至少在比MySQL其他數據庫)
  • 使用多個處理器和磁盤的處理查詢

將數據放在單個表中時,有一件事比較難,那就是安全性。事實上,在某些情況下,這是主要問題,基本上要求數據放在單獨的表格中。這些應用程序很少見。

爲了舉例說明如何將數據存儲在多個表中,可以想象,在您的系統中,每個公司都有一條記錄,並將其存儲在一個表中。這個記錄存儲關於公司的信息 - 比如姓名,地址等等。呼叫是100字節的信息。

在您的模式中,每個「公司」都有一個單獨的表格,因此每個表格只有一行。該記錄將駐留在一個數據頁面上。一個數據頁可能是16千字節,所以你浪費大約15.9千字節來存儲這些數據。存儲1000條這樣的記錄佔用16兆字節,而不是約7頁(112千字節)。這可能是一個重大的性能問題。

此外,對於多個表格,您沒有考慮維護所有表格和確保不同表格中數據的正確性的挑戰。維護更新需要應用於數千張表格,而不是少數表格。

+0

啊!這是我正在尋找的。謝謝。 – KimchiMan

0

與其中的所有公司製作一張桌子,但使用外鍵!您可以通過一個號碼識別每個公司,並擁有另一個查找表,其中包含每個數字和公司的字符串。像:

CREATE TABLE news 
(
news_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
company_id INT 11, 
timestamp TIMESTAMP NOT NULL, 
source TEXT NOT NULL, 
content TEXT NOT NULL, 
... 
) 

CREATE TABLE companies 
(
company_id INT 11 
company_name VARCHAR(10) 
) 

讓它明確與外鍵約束:http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

這樣,您將通過存儲號碼的重複,而不是字符串,你的指標將是更小的節省空間,你的查詢速度會更快。

+0

感謝您的回覆。我知道表可以使用外鍵分開,但我想知道兩個特定以上選項的性能。 – KimchiMan

+0

這取決於您想要執行的查詢的類型。如果您只想查詢某個特定新聞來源的記錄,那麼將它們拆分爲多個表格會更好。但是,如果您想要查詢特定內容的所有新聞來源,那麼將一張索引良好的表格執行得更好,因爲您不必查詢多個表格並彙總結果。 – Dijkgraaf

6

我對許多表格的使用經驗,對於擁有6000多個表格且不斷增長的公司而言,目前工作很多表格是管理多個表格的難點。好處是你減少了表中的行數(我在其他公司有3000萬行),這很好 - 但前提是你有一個可管理的解決方案來處理所有的表。

例如:6000+表實際上是酒店的房間號Id(data_room#_hotelID),所以我可以編寫存儲過程,bash或php腳本來處理它們。

從另一方面來說,許多行更簡單,因爲您需要處理的表較少,但是您需要開始創建如何將數據提取出來。你一定會想要在你的SQL WHERE子句中添加一個索引,但這很明顯。我已經在過去用來管理大表

選項包括:

1)插入帶有自動遞增的數據在某種程度上是有道理的(如按字母順序) - 但在看到你的數據的變化很多,這不是一個好的選擇

2)將表加載到內存 - 我不知道你在哪裏託管這個,但我在內存中使用MySQL。我只知道兩種方法來做到這一點:一是通過在MySQL本身設置它,另一種是有一個內存驅動器(使用一些計算機的內存),並將MySQL和它的數據移動到已安裝的驅動器(我已經也使用閃存驅動器)。

無論您是更頻繁地插入還是選擇數據,您都會想要考慮因素。

所以總結起來:

  • 如果您選擇讓很多表,確保他們沒有保持數據的大量和您可以管理他們所有。

  • 如果使用更少的表和更多的行,請使用索引,RAM驅動器和緩存來加速從大表中獲取數據的過程。

這是我的兩分錢,我希望它可以幫助你!

相關問題