IP 地理資料庫下載
將 CSV 資料匯入 MySQL 資料庫
1 2 3 4 5 |
LOAD DATA INFILE '/tmp/dbip-city.csv' INTO TABLE City FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; |
需要注意的是,下載下來的 csv 檔案,換行是 PC 格式
MySQL IPv4 範圍查詢
- MySQL check if an IP-address is in range?
- MySQL :: MySQL 5.7 Reference Manual :: 12.19 Miscellaneous Functions
1 2 3 4 5 6 7 |
SELECT * FROM City WHERE ( INET_ATON( "59.125.207.208" ) BETWEEN INET_ATON( ip_start ) AND INET_ATON( ip_end ) ) |
INET_ATON() 是專為 IPv4 設計的數值轉換 function
--
優化
DB-IP 提供了 PHP 的範例,大概長這樣
1 2 3 4 |
SELECT * FROM `City` WHERE INET_ATON( ip_start ) >= INET_ATON( "59.125.207.208" ) LIMIT 1 |
可以從 5 秒的查詢縮短到 1 秒,可惜的是還是不夠快,更快的方式就是將問題轉換成數學題,並且將需要運算的地方事先準備好
增加 ip_start_inet 以及 ip_end_inet 兩個欄位,填入的資料為 INET_ATON() 轉換後的結果
1 2 3 4 |
UPDATE City SET ip_start_inet = INET_ATON( ip_start ), ip_end_inet = INET_ATON( ip_end ) |
查詢時使用 <>= 運算元
1 2 3 4 |
SELECT * FROM `City` WHERE ip_start_inet <= INET_ATON( '211.20.170.215' ) AND ip_end_inet >= INET_ATON( '211.20.170.215' ) |
優化後可在低於 0.1 秒內完成
--
1,169 total views, 1 views today