Mysql,使用索引选择运算符>,<改善表现?

时间:2010-10-01 15:47:53

标签: mysql optimization select performance indexing

我需要从包含超过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秒的速度更快?

1 个答案:

答案 0 :(得分:2)

您是在两列上创建了一个索引,还是在每个列上创建了两个索引?如果只有一个索引,那么这可能是你的问题,为每个索引制作一个索引。索引仍应适用于<>

除了更改索引外,运行:

EXPLAIN
select *
from iptocity
where lowerbound<3529167967
  and upperbound>=3529167967
limit 1;

与您相同的查询,只是添加了EXPLAIN和一些换行符以便于阅读。

EXPLAIN关键字将使MySQL向您解释它是如何运行查询的,它将告诉您是否正在使用索引。对于任何运行缓慢的查询,请始终使用explain来尝试确定发生了什么。