我需要从超过500万行的表中选择一行。它是所有IP范围的表。每一行都有列upperbound和lowerbound。都是大整数,数字是IP地址的整数表示。
选择是:
select *
from iptocity
where lowerbound < 3529167967
and upperbound >= 3529167967
limit 1;我的问题是
...that选择花费的时间太长。如果不对InnoDB表进行索引,则需要20秒。如果是在MyISAM上,则需要6秒。我需要它少于0.1秒。我需要能够每秒处理数百次这样的选择。
我尝试在InnoDB上创建索引,在上下两列上创建索引。但这并没有帮助,它甚至花了更多的时间,比如40秒来选择ip。怎么啦?为什么索引没有帮助呢?索引只适用于=运算符,而>,<运算符不能使用索引吗?我应该怎么做才能让它的选择时间少于0.1秒?
发布于 2010-10-01 23:53:08
您是在两列上都创建了一个索引,还是创建了两个索引,每列一列?如果只有一个索引,那么这可能是您的问题,为每个索引创建一个索引。索引应该仍然适用于<和>
除了更改索引之外,还可以运行:
EXPLAIN
select *
from iptocity
where lowerbound<3529167967
and upperbound>=3529167967
limit 1;与您的查询相同,只是添加了EXPLAIN和一些换行符以提高可读性。
EXPLAIN关键字将使MySQL向您解释它是如何运行查询的,并且它将告诉您是否正在使用索引。对于任何运行缓慢的查询,请始终使用explain来尝试找出发生了什么。
https://stackoverflow.com/questions/3840808
复制相似问题