2013-06-27 96 views
0

這聽起來可能是一個普遍的問題,但我有一些想法可以通過在這裏共享來發展。如何爲大數據設計RDBMS

我們的應用程序有超過1000萬條記錄的幾個表;查詢它們大約需要40秒。我們已經遵循已知的數據庫設計慣例,如使用主鍵,索引等。我們也嘗試歸檔舊行和表分割等,但它仍然不那麼令人印象深刻。

該應用程序的數據密集程度相當高,但據我所知,儘管像銀行這樣的許多網站確實有大量數據,但它們仍然具有良好的性能。我不是數據庫專家;任何人都可以在這裏指出我缺少的東西嗎?

會有一些標準的技術,如數據庫集羣等,有些是我的基礎設施不允許的。

與原始存儲相比,是否有可能以更加處理的格式存儲數據存在一個模糊的想法?數據庫設計中是否出現了新的設計實踐?我可以輕鬆遷移到NoSQL嗎? NoSQL又有多好?

回答

6

一千萬行並不是那麼多。根據個人情況調整您的查詢。如果您有一個需要40秒的查詢,找出它是哪一個並修復它。使用未編入索引的where子句中的單個列可以使性能從.0001秒變爲40秒。大多數數據庫都具有「解釋查詢」功能,可以告訴您查詢的執行方式。

A smallish我最近研究的「大數據」問題有1000億行 - 壓縮10 TB左右的數據。

如果你還沒有想出爲什麼你的查詢很慢,你可能甚至不應該考慮非RDBMS解決方案。

+0

我已經在後端使用cakephp,這可以限制微調查詢嗎?同樣,查詢表的時間僅取決於表的大小或數據庫的整體大小,對其他表的大小有任何影響 –

+0

其他表的大小通常不影響沒有打到它們的查詢 - 大量併發線程正在處理這些查詢其他表*可能會影響不會觸及它們的查詢。但最重要的是如果你還沒有優化你的查詢。 – Keith

0

這裏有三個技巧,很容易實現,併爲您帶來巨大的性能提升。

1請確保您使用的是內部連接,而不是WHERE子句。

例如,寫

SELECT 姓氏,地址 FROM 顧客 INNER JOIN CustomerAddress ON Customer.ID = CustomerAddress.CustomerID

代替:

SELECT 姓氏,地址 FROM Customer,CustomerAddress WHERE Customer.ID = Custome rAddress.CustomerID

2避免使用WHERE子句中的函數。

例如,

WHERE左(市,1)= 'M'

將導致整個表(即使行,其中市不以 「M」 開始)的索引掃描

相反,使用

WHERE城市像 'M%'

這同樣適用於其他所有功能,如DATEDIFF,上等

0真

3確保在每個使用WHERE子句的列上都有一個索引。