gpt4 book ai didi

sql - MySQL 查询需要更长的索引?

转载 作者:行者123 更新时间:2023-11-29 03:13:20 24 4
gpt4 key购买 nike

我有一个 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 秒。在尝试调整表以提高性能时,我在 startend 列上添加了索引。出于某种原因,这会显着降低性能 5 倍。有谁知道或有任何想法,为什么添加这些索引会严重损害性能?

最佳答案

MySQL 查看涉及的列并误以为索引将有助于改进查询。但问题是索引解决了开始和结束部分,但需要解析回 record-ids 来解析 a.event_id != b.event_id,这本身就是一个昂贵的操作。

没有索引会强制执行交叉连接和过滤器,虽然可能会膨胀到大量临时记录,但实现起来要简单得多。

如果您的查询受 a 或 b 上某个范围的限制,并且/或表大于 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。在任何情况下,通过在查询前添加“EXPLAIN”来显示 MySQL 如何收集结果(无索引、有索引、有索引但被忽略),了解 MySQL 在每种情况下的作用总是有帮助的。

关于sql - MySQL 查询需要更长的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com