哪個數據庫應該用於我的特定目標
介紹:
我試圖弄清楚我應該為我的項目使用什麼樣的數據庫以獲得最佳速度。
背景:
我不確定 MySQL 是否是最好的解決方案,但我會以 MySQL 為例來解釋我目前擁有的數據。目前(或將要)的數據排列在 2 個表中。
表 1 有 3 列,表 2 有 1 列。這兩個表每個都有大約 10 億行。
該項目將從表 2 中獲取第一個值,並檢查它是否存在於表 1 的第一列中。
該項目目前在具有機械驅動器的電腦上執行。
粗略估計數據表明將使用大約 500GB 的驅動器空間。
目標:
- 為了能夠盡快將數據插入表中,
- 為了能夠盡快比較表 2 中的每一列,看看表 1 的第 1 列中是否存在相同的值。
進步:
目前,我正在將數據插入 MySQL 數據庫並將插入批處理成 1000 個組,平均每秒插入約 200 個。按照這個速度,生成和插入 10 億條記錄大約需要 2 個月的時間。
基準:
生成數據和插入數據的過程使用大約 5% 的 CPU,大約 16GB 的可用 RAM,並且在檢查磁碟 IO 時,平均大約為 2MB/s。所以我的猜測是機械驅動是瓶頸。我經常聽到它在尋找。
問題:
考慮到可能的機械驅動器作為瓶頸(如果我錯認為這是瓶頸,請糾正我),MySQL 是盡快實現上述 2 個目標的最佳選擇,還是我應該使用不同類型的數據庫正在考慮並改用?
XY 問題
我在您的文章中看到太多危險信號,無法發表評論。一般來說,你似乎有一個XY 問題。
問題 1
我可以不斷地聽到它逐漸消失。
停止!跑!不要走路!盡快更換這個高畫質!
如果它真的發出磨擦聲,那麼你的高畫質已經烤好了。
問題 2
它的平均速度約為 2MB/s
現代硬碟驅動器可以實現600 MB/s 範圍內的 IO 傳輸速度。您的觀察意味著您遇到了與數據庫無關的問題。
確保在數據庫之外執行 IO 基準測試。如果您的數據程序沒有接近測量的傳輸速度,那麼瓶頸不在於磁碟 IO。
通常,這與您處理數據的方式有關。
問題 3
平均每秒大約 200 次插入。
啊!!現在我們正接近問題的核心。
這通常表明您正在使用逐個緩慢的過程方法來載入數據。
您需要在Bulk中載入數據。當您這樣做時,您應該會在幾秒鐘內
INSERT
看到接近 1M 行的速率。然後,您的 IO 傳輸速率應該更接近您在數據庫之外測量的值。問題 4
以可能的機械驅動為瓶頸
使用RAID設置來提高 IO/IOPS 性能。這適用於 HDD 和 SSD。
問題 5
- 為了能夠盡快比較表 2 中的每一列,看看表 1 的第 1 列中是否存在相同的值。
關係數據庫是基於關係代數建構的。如果您可以將您的業務需求更改為一個關係代數問題,那麼該解決方案將變得不費吹灰之力
我建議您更改您的要求,以便
Table_1.Column_1
需要的值UNIQUE
和NOT NULL
- 不允許數據庫接受
Table_2
不符合規定要求的數據。從那裡,答案變成“在指向的
FOREIGN KEY
每一列上使用a ”。Table_2``PRIMARY KEY (TABLE_1.COLUMN_1)
FK 檢查期間的成本
INSERT
應該是最小的。我不知道有任何主要的關係數據庫無法處理 10 億行子表和/或 10 億行父表。所以,MySQL應該沒問題。(順便說一句 - “軟體列表”問題與本論壇無關。)