MySQL 5.0按索引排序慢

时间:2014-07-16 16:12:28

标签: php mysql indexing

我有这个问题:

SELECT * FROM projects WHERE current = 1 ORDER BY id DESC LIMIT 0,20

id是主键,并为currentstatus字段创建了索引

CREATE INDEX currentstatus ON projects (current, status)

该表有30,000多行,此查询运行在大约4.0s

我想使用force index for group by (id),但MySQL 5.0不支持它。

说明显示currentstatus用于查询,但我希望currentstatus用于WHERE子句,PRIMARY用于ORDER BY }子句

由于使用频繁,我们无法升级数据库,因此我们无法停机。我想知道是否有一种方法可以在MySQL 5.0中优化此查询,以便在排序时使用主键索引?

编辑:在MySQL 5.1+中,理想的查询将是

SELECT * FROM projects FORCE INDEX FOR ORDER BY (PRIMARY) WHERE current = 1 ORDER BY id DESC LIMIT 0,20;

2 个答案:

答案 0 :(得分:1)

在MySQL 5.0中,正如您所提到的,不可能仅对ORDER BY子句强制/使用特定索引。

http://dev.mysql.com/doc/refman/5.0/en/index-hints.html

MySQL 5.1+确实允许这样做。

正是由于这个原因,他们可能在MySQL 5.1中添加了这个功能

答案 1 :(得分:0)

我找到了一个解决方案,更多的是解决此问题的方法。这至少可以实现更快的查询:

SELECT * FROM projects WHERE current = 1 AND id > ((SELECT MAX(id) FROM projects) - 1000) ORDER BY id DESC LIMIT 20;

这将默认使用PRIMARY键id作为/ where子句的顺序,并且它是一个足够小的子集来扫描该查询在我当前数据集上以0.00s vs 4.35s运行。对于这种情况,1000行将保证至少有20条记录current = 1