我想显示10个最新的论坛主题,我通过订购日期ASC来完成。我把日期索引,然而,它仍然得到所有行检查(我使用EXPLAIN来看看)。ORDER BY使用所有行
问题是什么,或者如果没有看到我的表格就看不到它?
谢谢。
我想显示10个最新的论坛主题,我通过订购日期ASC来完成。我把日期索引,然而,它仍然得到所有行检查(我使用EXPLAIN来看看)。ORDER BY使用所有行
问题是什么,或者如果没有看到我的表格就看不到它?
谢谢。
根据索引的类型,按日期排序需要全面扫描。我认为你不能用mysql做很多事情。
不过,一种解决方案是使用WHERE子句“剪切”搜索。例如
WHERE date > 10 days ago
排序将不会在完整扫描中完成,而是在WHERE子句之后留下的内容。
奇怪,因为它看起来,并根据您的表,您可能能够优化您的查询... 2查询。例如:
SELECT max(primary key) from topics => $max
SELECT topic from topics where primary key >= $max - 10
这2要求会比一个完整的扫描速度更快,如果你的表有很多行,肯定会产生相同的结果,如果你的主键是自动递增。
我希望这将有助于你
杰罗姆·瓦格纳
你所描述的应该工作,但真的很容易打破http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html给出的原因在于它可以打破一个列表。没有看到你的SQL,我不知道你在做什么。不过这里是如何使这项工作的一个例子:
SELECT topic
FROM forum_posts
ORDER BY some_date DESC
LIMIT 10
如果你有更复杂的查询,打破这一点,你可以加入到这个查询筛选结果和保存工作。例如。
SELECT f.topic
, o.some_information
, some_date
FROM (
SELECT id, topic, some_date
FROM forum_posts
ORDER BY some_date DESC
LIMIT 10
) f
JOIN other_table o
ON o.forum_id = f.id
ORDER BY some_date DESC
有很多事情可以影响这一点。列别名,WHERE子句中的OR语句等等...你在使用LIMIT吗?我们可以看到EXPLAIN的查询和输出吗? – McAden 2011-02-26 20:56:18
@McAden:是的,我使用限制 – 2011-02-26 20:59:33
在没有太多行的表上,全表扫描可能比索引扫描+从表中获取数据便宜。 – 2011-02-26 21:00:32