优化表和查询

时间:2013-05-23 00:29:44

标签: mysql database

我在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_

由于记录的数量,查询对于我需要的内容来说太迟了。

有什么想法来优化这个问题吗?

1 个答案:

答案 0 :(得分:0)

你有(from_, to_)的索引吗?这是开始的地方。

然后,下一个想法是获取索引并将查询更改为:

select region
from ipcountry
where ip >= from_
order by from_ desc
limit 1;

如果这不会提高性能,那么您将不得不考虑如何优化数据结构。这里的极端方法是列出其所在区域的所有IP地址。但是,数十亿行产生的行实际上可能会阻碍性能。

如果沿着这条路走下去,你需要变得更聪明。一种想法是为具有恒定区域的类型A,类型B和类型C地址提供单独的表。然后是D类地址范围的单独表格。