2011-06-11 36 views
6

我正在處理大型數據集(數以百萬計的記錄,有時甚至是數百萬),並且希望使用與R鏈接良好的數據庫程序。我試圖在mysql和sqlite。數據是靜態的,但是我需要做很多查詢。用於大型數據集的sqlite或mysql

在這種link to sqlite help,它指出:

「隨着1024個字節的默認頁面大小,SQLite數據庫的大小限制爲2個千兆字節(241個字節),即使它能夠處理更大的數據庫, SQLite將整個數據庫存儲在一個單獨的磁盤文件中,許多文件系統將文件的最大大小限制爲小於這個值,所以如果你正在考慮使用這種數據庫,那麼你最好考慮使用一個客戶/服務器數據庫引擎來傳播其內容跨多個磁盤文件,也可能跨多個卷。「

我不確定這是什麼意思。當我嘗試使用mysql和sqlite時,似乎mysql更快,但我還沒有構建非常嚴格的速度測試。我想知道,由於我的數據集的大小,對於我來說mysql是比sqlite更好的選擇。上面的描述似乎表明,這可能是這種情況,但我的數據不在2TB附近。

有一個discussion on stackoverflow觸及此並引用相同的SQLite信息頁面,但它並沒有完全解決這個問題。

我很感激任何洞察力來理解文件系統的最大文件大小的這種約束,以及這會如何影響索引表和運行查詢的速度。這對我決定使用哪個數據庫進行分析確實有幫助。

回答

6

SQLite數據庫引擎將整個數據庫存儲到一個文件中。這對於難以置信的大文件可能不是很有效(SQLite的限制是2TB,正如你在幫助中找到的那樣)。另外,SQLite一次只能限制一個用戶。如果你的應用程序是基於web的,或者最終可能是多線程的(比如Android上的AsyncTask),那麼mysql可能是最好的選擇。

就個人而言,由於您已經完成了測試,而且mysql更快,我只需要使用mysql。未來將會更具可擴展性,並可讓您做更多。

+0

他說什麼...... – Bohemian 2011-06-11 14:14:35

1

SQL如果您主要將其用作Web服務。 SQLite,如果你希望它能夠離線工作。

SQLite通常要快得多,因爲大部分(或全部)數據/索引將被緩存在內存中。但是,在SQLite的情況下。如果根據我迄今的經驗將數據分成多個表,甚至多個SQLite數據庫文件。即使有數百萬條記錄(我還有百萬的記錄),它比SQL更有效(補償延遲等)。但是,這是記錄在不同表格中拆分時的情況,並且查詢是特定於這些表格的(查詢所有表格)。

一個例子是在簡單遊戲中使用的物品數據庫。雖然聽起來可能聽起來不太多,但UID將發佈甚至變化。因此,發電機很快就會迅速制定出更多的一百萬套具有變化的「統計數據」。然而,這主要是由於每1000組記錄被分成不同的表格。 (因爲我們主要通過其UID拉取記錄)。雖然分裂的表現沒有得到適當的衡量。我們得到的查詢比SQL快10倍(主要是由於網絡延遲)。

雖然有趣,但我們最終將數據庫減少到了1000個條目,並且有項目[pre-fix]/[suf-fix]確定變化。 (就像暗黑破壞神,只是它被隱藏起來)。事實證明,在一天結束時會更快。

雖然在一個側面說明,我的情況主要是由於查詢排隊一個接一個(等待之前的一個)。但是,如果您能夠同時對服務器執行多個連接/查詢。 SQL中的性能下降,從您的客戶端獲得更多補償。假設這個查詢不會相互分支/交互(例如,如果得到的結果是查詢這個,否則)

5

我不確定這是什麼意思。當我嘗試使用mysql和sqlite時,似乎mysql更快,但我還沒有構建非常嚴格的速度測試。

在短短的版本是:

  1. 如果您的應用需要適應一個電話或其他一些嵌入系統上,使用SQLite。這就是它的設計目的。

  2. 如果你的應用程序也許需要不止一個併發連接,不使用SQLite。使用PostgreSQL,MySQL的InnoDB的帶等

+1

該OP提到數據是靜態的,這表明可能只有'SELECT'將會運行,在這種情況下SQLite可能能夠很好地處理併發連接? – joran 2011-06-11 15:15:50

+0

是的,但SQLite imho的行數太多了。這會導致文件太大。 – 2011-06-11 15:30:18

3

似乎(在R,至少),即SQLite是真棒爲特設分析。通過RSQLitesqldf包,加載數據和開始真的很容易。但對於一次又一次使用的數據,在我看來,MySQL(或SQL Server)是要走的路,因爲它在修改數據庫方面提供了更多功能(例如添加或更改密鑰) 。

相關問題