2013-07-11 71 views
1

我的項目的一部分涉及在我的數據庫中存儲和檢索ips的負載。我估計我的數據庫在啓動項目的幾個月內會有數百萬ips的數據。我一直想知道如何簡單地查詢大型數據庫可以得到的情況?什麼將是以下查詢的大致速度:與2.65億行的表ips的大型mysql數據庫

SELECT * FROM table where ip= '$ip' LIMIT 1 
INSERT INTO table(ip, xxx, yyy)VALUES('$ip', '$xxx', '$yyy') 

我可以通過創建255^2個表來創建將具有與所有可能的ipv4 ip地址的所有前兩個數字相對應的名稱來加速查詢速度,那麼每個表將具有最多255^2行所有可能的第二部分到IP。因此,例如查詢IP地址「216.27.61.137」它將被分成2部分,「216.27」(p1)和「61.137」(p2)。首先,腳本將選擇名稱爲p1的表格,然後檢查是否有任何稱爲「p2」的行,如果是,則會從該行中提取所需的數據。將使用相同的過程將新的ips插入到數據庫中。

如果上述計劃不起作用,那麼加快大型數據庫查詢的好方法是什麼?

+2

閱讀關於MySQL中的'INDEX's。 –

+2

使用IPv4地址的字符串表示將比使用'UNSIGNED INT'要慢很多。對於IPv6兼容性,您會遇到字符串,並且它們會更長。 Sharding在這裏不是一個壞主意,但只有當你有插入爭用。值得注意的是,Postgres支持[IP地址作爲本地列類型](http://www.postgresql.org/docs/9.2/static/datatype-net-types.html)。 – tadman

+0

mysql不是唯一的*開源關係數據庫管理系統* – 2013-07-11 21:09:00

回答

0

之前做任何諸如此類的,讀了這個問題(更重要的),它的答案:How to store an IP in mySQL

它一般不會到多個表之間拆分數據是個好主意。數據庫索引擅長他們所做的事情,所以請確保相應地創建它們。用於存儲IPv4地址的二進制列可以很好地工作 - 這更多的是查詢負載而不是表大小的問題。

0

首先,你無法預測多長時間的查詢需要,即使我們知道數據庫,數據庫服務器,網絡性能和其他成千上萬的變量的所有信息。

第二,如果你使用的是體面的數據庫引擎,你不必將數據分割成不同的表。它知道如何處理大數據。將數據庫功能留給數據庫本身。

處理大型數據集有幾種解決方法。使用正確的數據類型並創建正確的索引將有很大幫助。

當您的數據庫開始出現問題時,請搜索特定於您遇到的問題的內容。

大數據問題沒有銀彈。

1

到這兩個問題的答案取決於是否使用INDEXES

如果您的表在ip上編制索引,則無論您的表的大小如何,您的第一個查詢都應立即執行或多或少:MySQL將使用該索引。由於MySQL必須更新每個INSERT上的索引,因此您的第二個查詢將會變慢。

如果你的表是不是索引然後第二個查詢將幾乎立即執行的MySQL能夠只是在表的末尾添加一行。您的第一個查詢可能無法使用,因爲MySQL每次都必須掃描整個表。

問題是平衡。添加一個索引將加速第一個查詢,但會減慢第二個查詢。到底發生了什麼將取決於服務器硬件,您選擇的數據庫引擎,MySQL的配置,當時還在發生什麼。如果性能可能很關鍵,那麼先做一些測試。