我有一张约有26
百万条记录的表格。有一个isProcessed
标记和一个timestamp
列,我想选择最早的未处理记录。目前,5
有大约isProcessed == 0
百万条记录。
我执行以下查询,该查询在大约40
秒内完成。
select * from EventData where isProcessed=0 order by timestamp ASC limit 1;
我在isProcessed
列上有升序索引,在timestamp
列上有升序索引。我是否需要在两列上都有复合索引?
我做错了什么?查询看起来很简单。
答案 0 :(得分:2)
两个单独的索引不与复合索引相同。您需要按此顺序
INDEX(isProcessed, timestamp)
这样,它可以在索引中找到所需的一行,然后立即进入数据。
“大约40秒后完成” - 由于INDEX(isProcessed)
基本无用,它进行了25M行的表扫描。
答案 1 :(得分:0)
如果isProcessed只有两个可能的值0或1;最好不要将其编入索引。在这种情况下,全表扫描速度更快;尝试此查询,看看它是否有帮助。 mysql> SELECT * FROM EventData FORCE INDEX (timestamp) WHERE EventData.isProcessed = 0 ORDER BY EventData.timestamp ASC LIMIT 0, 1;
最好不要使用像时间戳这样的保留字作为列名。