我有这个问题:
SELECT * FROM projects WHERE current = 1 ORDER BY id DESC LIMIT 0,20
id
是主键,并为current
和status
字段创建了索引
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;
答案 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
。