2010-06-17 19 views
1

我從http://www.wipmania.com/en/base/下載WIPmania的worldip表 - 表中有3場和周圍的79K行:顯示我國基於我的IP,MySQL的優化

  • startip //例如:3363110912
  • endip //例如:3363112063
  • 國家//例如:AR(阿根廷)

所以,讓我們假設我在阿根廷和我的IP地址是:200.117.248.17

1)我用這個功能來我的IP轉換爲長

function ip_address_to_number($ip) { 
    if(!$ip) { 
     return false; 
    } else { 
     $ip = split('\.',$ip); 
     return($ip[0]*16777216 + $ip[1]*65536 + $ip[2]*256 + $ip[3]); 
    } 
} 

2)我通過匹配長轉換的IP搜索正確的國家代碼:

$sql = 'SELECT * FROM worldip WHERE '.ip_address_to_number($_SERVER['REMOTE_ADDR']).' BETWEEN startip AND endip'; 

這相當於: SELECT country FROM worldip WHERE 3363174417 BETWEEN startip AND endip(benchmark:顯示行0 - 0(總計1個,查詢需要0.2109秒))

現在來了realquestion。如果

阿根廷球員的另一一堆也打開該網站,它們都具有這些IP地址:

  • 200.117.248.17
  • 200.117.233.10
  • 200.117.241.88
  • 200.117.159.24

因爲我緩存所有的SQL查詢;而不是匹配在數據庫中的每個IP查詢,它會更好(和正確)只是通過修改這樣的功能來匹配ip的2個第一部分? (注意IP的第3個和第4個分割值已被刪除)。

這樣,而不是查詢這4個值:

...我所查詢的是:3363110912(這是200.117。0.0轉換爲長)。

這是正確的嗎?任何其他想法來優化這個過程?

+0

代理用戶呢? – 2010-06-17 15:41:34

+1

如果您只是在worldip列上添加索引,查詢應該很快。我敢打賭,查詢將在10毫秒內完成。基準測試一旦索引就緒,就可以測試您的測試結果。如果你還沒有進行基準測試,你會過早地進行優化。 – 2010-06-17 15:41:42

+0

@Srinivas:我可以使用getenv('HTTP_X_FORWARDED_FOR'); - 只是沒有把它添加到這個代碼呢。 @Frank:事情是這個網站每月有300萬次訪問。我不能基準查詢的數量,直到這段代碼上線 - 這就是爲什麼我必須過早優化;) - 我會添加一個索引,雖然:主要開始結束 – andufo 2010-06-17 15:48:33

回答

1

您是否必須使用WIPmania?如果不是,Maxmind提供了一個開源解決方案:http://www.maxmind.com/app/geolitecountry。好處是它是一個二進制文件,並且有一個PHP擴展(你必須編譯它並安裝它)。在幾個項目中使用它,查找速度非常快。您可以在此處獲得PCL擴展名: http://pecl.php.net/package/geoip

+0

哇,不錯的選擇。這意味着沒有任何MySQL連接? – andufo 2010-06-17 18:08:50

+0

是的,它根本不依賴於mysql,一旦安裝就完全獨立運行... – 2010-06-17 18:48:34

2

No.

193.150.1.1 - 俄語IP 193.150.230.1 - 瑞典IP

你可能可以把它截斷到前三octects,但是......你不會有那麼多的緩存命中。而且很有可能某些/ 24網絡在兩個國家之間分裂。有時候,小於/ 24的塊被給出。

+0

感謝您的提示。該死的...這將是很多點擊。 – andufo 2010-06-17 15:55:37