[英]Redesign my database to reduce the query execution time [SQL Server Express]
我有下表:
Network_id: varchar(15) (it's an IP-Address)
mask: tinyint (values: 1-32)
AS: bigint (values: 0-400000)
該表大約有80萬行。
我有一個IP地址作為輸入,我試圖找出它屬於哪個網絡。
我嘗試了很多方法。
方法一:
我將表的結構轉換為:
start_ip, end_ip
並編寫了一個存儲過程以查明一個IP地址是否在2個ip地址之間,然后編寫了另一個存儲過程,該存儲過程使用CURSOR來迭代表的記錄並調用第一個過程,當命中時它將中斷並返回選擇的記錄。
此方法大約需要15到20秒才能達到要求,有時在得到結果之前會遇到超時錯誤。
因此,我嘗試了方法二:
方法二
我試圖將IP地址分離為tinyint
類型的xyzt,並試圖選擇一條記錄,其中x,y,z,t的條件具有特定值。
相同的時間和相同的結果
方法三:
我對這種方法有一個想法,但是我沒有實現它。
我們可以創建5個級別的樹
我認為這種方式對我有很大幫助,但是我沒有找到在數據庫設計中實現它的方法。
將理解將在數據庫中實現的任何其他想法,或者關於如何實現第三種方法的想法。
您想從“網絡”的角度看問題。
通過使用“基本”網絡地址(IPv4為32位)和“掩碼”來定義表,該掩碼可讓您知道范圍。
然后,您可以執行類似(偽代碼)的操作:
select networkName
from networkDefinition n
where (n.ip = n.mask <bitwise and> <search address>
order by n.mask descending
我在sql server中設計了一個ip-geolocation數據庫,並且通過按ip地址聚集的單個表能夠獲得出色的性能,例如:
create table ip2location (
ip_start binary(4) not null,
location_id int not null,
primary key clustered (ip_start))
我只假定范圍是連續的,並且具有location_id為“未知”,而不是使用ip_start和ip_end列
查找給定IP地址的位置可以快速實現以下查詢:
select top 1 location_id from ip2location
where ip_start <= @some_ip order by ip_start desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.