我從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轉換爲長)。
這是正確的嗎?任何其他想法來優化這個過程?
代理用戶呢? – 2010-06-17 15:41:34
如果您只是在worldip列上添加索引,查詢應該很快。我敢打賭,查詢將在10毫秒內完成。基準測試一旦索引就緒,就可以測試您的測試結果。如果你還沒有進行基準測試,你會過早地進行優化。 – 2010-06-17 15:41:42
@Srinivas:我可以使用getenv('HTTP_X_FORWARDED_FOR'); - 只是沒有把它添加到這個代碼呢。 @Frank:事情是這個網站每月有300萬次訪問。我不能基準查詢的數量,直到這段代碼上線 - 這就是爲什麼我必須過早優化;) - 我會添加一個索引,雖然:主要開始結束 – andufo 2010-06-17 15:48:33