首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL查询需要更长的索引时间吗?

问MySQL查询需要更长的索引时间吗?
EN

Stack Overflow用户
提问于 2011-01-16 22:25:08
回答 1查看 286关注 0票数 2

我有一个MySQL InnoDB表events,它有3行:

代码语言:javascript
复制
event_id  ---> int
start     ---> long
end       ---> long

我编写了一个简单的查询,用于获取与另一个事件冲突的某个范围内的所有事件:

代码语言:javascript
复制
select a.* from events a, events b 
where a.event_id != b.event_id and 
      a.start < b.end and 
      b.start < a.end

该表有10K行,执行时间为2秒。在尝试调整表以提高性能时,我在start和end列中添加了索引。由于某些原因,这种显着地降低了性能的5x的一倍。有谁知道,或者有什么想法,为什么增加这些指数会损害表现那么糟糕?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-16 22:31:14

MySQL查看了所涉及的列,并错误地认为索引将有助于改进查询。但问题是索引解决了起始部分,但需要解析回记录ids来解析a.event_id != b.event_id,这本身就是一项昂贵的操作。

没有索引会强制交叉连接和筛选,这虽然可能会膨胀到大量的临时记录,但它是一个简单而简单的实现。

如果您的查询被a或b上的某个范围绑定到start-end,并且/或表大于10k,则可能会变成一幅非常不同的图片。

如果需要保留索引,可以强制特定查询(如果您知道这有帮助)忽略索引:

代码语言:javascript
复制
select a.*
from events a ignore index (index1)
cross join events b ignore index (index1)
where a.event_id != b.event_id and 
      a.start < b.end and 
      b.start < a.end

假设索引名为index1。在任何情况下,查看MySQL在每种情况下都做了什么总是很有帮助的,在查询前添加"EXPLAIN“,以显示MySQL如何收集结果(没有索引,但忽略了)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4708510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档