我在MySQL服务器上有一个数据库,有关于ip范围和位置的信息,它有下一个结构:
id (integer not null, auto inc)
from_ (bigint(20))
to_ (bigint(20))
region(integer)
字段区域是表格城市的外键(id,city_name)。
我们知道,要找到哪个国家/地区属于IP地址,我们必须执行类似下一个查询的内容:
select region from ipcountry where ip >= from_ and ip <= to_
由于记录的数量,查询对于我需要的内容来说太迟了。
有什么想法来优化这个问题吗?
答案 0 :(得分:0)
你有(from_, to_)
的索引吗?这是开始的地方。
然后,下一个想法是获取索引并将查询更改为:
select region
from ipcountry
where ip >= from_
order by from_ desc
limit 1;
如果这不会提高性能,那么您将不得不考虑如何优化数据结构。这里的极端方法是列出其所在区域的所有IP地址。但是,数十亿行产生的行实际上可能会阻碍性能。
如果沿着这条路走下去,你需要变得更聪明。一种想法是为具有恒定区域的类型A,类型B和类型C地址提供单独的表。然后是D类地址范围的单独表格。