我有一个MySQL InnoDB表events,它有3行:
event_id ---> int
start ---> long
end ---> long我编写了一个简单的查询,用于获取与另一个事件冲突的某个范围内的所有事件:
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的一倍。有谁知道,或者有什么想法,为什么增加这些指数会损害表现那么糟糕?
发布于 2011-01-16 22:31:14
MySQL查看了所涉及的列,并错误地认为索引将有助于改进查询。但问题是索引解决了起始部分,但需要解析回记录ids来解析a.event_id != b.event_id,这本身就是一项昂贵的操作。
没有索引会强制交叉连接和筛选,这虽然可能会膨胀到大量的临时记录,但它是一个简单而简单的实现。
如果您的查询被a或b上的某个范围绑定到start-end,并且/或表大于10k,则可能会变成一幅非常不同的图片。
如果需要保留索引,可以强制特定查询(如果您知道这有帮助)忽略索引:
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如何收集结果(没有索引,但忽略了)
https://stackoverflow.com/questions/4708510
复制相似问题