【问题标题】:Mysql, does using index for selects with operators >,< improve performance?Mysql,使用索引进行选择与运算符 >,< 提高性能吗?
【发布时间】:2011-04-19 22:35:29
【问题描述】:

我需要从包含超过 500 万行的表中选择一行。它是所有 IP 范围的表。每行都有upperboundlowerbound 列。都是大整数,数字是IP地址的整数表示。

选择是:

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

我的问题是

...选择花费的时间太长。在 InnoDB 表上没有索引时,需要 20 秒。如果它在 MyISAM 上,则需要 6 秒。我需要它小于 0.1 秒。而且我需要能够每秒处理数百个这样的选择。

我尝试在 InnoDB 的上限和下限列上创建索引。但这并没有帮助,它需要更多的时间,比如选择 ip 需要 40 秒。怎么了?为什么索引没有帮助?索引是否仅适用于 = 运算符,而 >,

【问题讨论】:

标签: mysql optimization select performance indexing


【解决方案1】:

您是在两列上都创建了一个索引,还是在每个列上都创建了两个索引?如果只有一个索引,那么这可能是您的问题,为每个索引创建一个。索引应该仍然适用于 &lt;&gt;

除了改变索引,运行:

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

与您的查询相同,只是添加了EXPLAIN 和一些换行符以提高可读性。

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

【讨论】:

  • 谢谢,伙计。我在两列上都做错了索引。每列的单独索引有效。我还将 bigint 更改为 int 并将这些列设置为非 Null。现在选择非常快,平均 10 毫秒。
  • @user 很高兴知道它有帮助!但仅供参考,在 SO 和相关网站上,当您找到解决问题的答案时,您应该通过检查旁边的绿色大复选标记来接受它作为正确答案。
猜你喜欢
  • 1970-01-01
  • 2020-03-05
  • 2013-09-15
  • 2011-09-17
  • 2013-11-30
  • 2011-08-19
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多