简单的MySQL查询似乎很慢

时间:2015-06-26 17:08:18

标签: mysql performance

我有一张约有26百万条记录的表格。有一个isProcessed标记和一个timestamp列,我想选择最早的未处理记录。目前,5有大约isProcessed == 0百万条记录。

我执行以下查询,该查询在大约40秒内完成。

select * from EventData where isProcessed=0 order by timestamp ASC limit 1;

我在isProcessed列上有升序索引,在timestamp列上有升序索引。我是否需要在两列上都有复合索引?

我做错了什么?查询看起来很简单。

2 个答案:

答案 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;最好不要使用像时间戳这样的保留字作为列名。