我需要从包含超过5百万行的表中选择一行。它是所有IP范围的表。每行都有upperbound
列和lowerbound
列。所有都是大整数,数字是IP地址的整数表示。
选择是:
select *
from iptocity
where lowerbound < 3529167967
and upperbound >= 3529167967
limit 1;
...选择花费的时间太长了。如果没有InnoDB表上的索引,则需要20秒。如果它在MyISAM上则需要6秒钟。我需要它不到0.1秒。而且我需要能够每秒处理数百个这样的选择。
我尝试在InnoDB上创建索引,在上行和下行两列。但它没有帮助,花了更多的时间,比如40秒选择ip。怎么了?为什么索引无济于事?索引是否仅适用于=运算符,&gt;,&lt;运营商不能使用索引?我该怎么做才能让选择时间少于0.1秒的速度更快?
答案 0 :(得分:2)
您是在两列上创建了一个索引,还是在每个列上创建了两个索引?如果只有一个索引,那么这可能是你的问题,为每个索引制作一个索引。索引仍应适用于<
和>
除了更改索引外,运行:
EXPLAIN
select *
from iptocity
where lowerbound<3529167967
and upperbound>=3529167967
limit 1;
与您相同的查询,只是添加了EXPLAIN
和一些换行符以便于阅读。
EXPLAIN
关键字将使MySQL向您解释它是如何运行查询的,它将告诉您是否正在使用索引。对于任何运行缓慢的查询,请始终使用explain
来尝试确定发生了什么。