这个查询是非常简单的,所有我想做的事,就是让所有在给定的类别由last_updated
字段排序的文章:如何避免在多对多查询中使用“临时”?
SELECT
`articles`.*
FROM
`articles`,
`articles_to_categories`
WHERE
`articles`.`id` = `articles_to_categories`.`article_id`
AND `articles_to_categories`.`category_id` = 1
ORDER BY `articles`.`last_updated` DESC
LIMIT 0, 20;
但它运行很慢。这里解释什么说:
select_type table type possible_keys key key_len ref rows Extra
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SIMPLE articles_to_categories ref article_id,category_id article_id 5 const 5016 Using where; Using temporary; Using filesort
SIMPLE articles eq_ref PRIMARY PRIMARY 4 articles_to_categories.article_id 1
有没有办法重写此查询或添加额外的逻辑来我的PHP脚本,以避免Using temporary; Using filesort
和速度的东西呢?
表结构:
*articles*
id | title | content | last_updated
*articles_to_categories*
article_id | category_id
UPDATE
我已经last_updated
索引。我想我的情况在d ocumentation解释说:
在某些情况下,MySQL不能使用 索引来解决ORDER BY, 尽管它仍然使用索引来找到 WHERE子句匹配的行。 这些情况包括:
用于提取行的键不同于ORDER BY中使用的键: SELECT * FROM t1 WHERE key2 =常量ORDER BY key1;
要加入很多表,并在ORDER BY的 列不是从第一个非恒定表 用于检索所有行 。 (这是EXPLAIN输出 第一表 没有一个const连接类型。)
,但我仍然不知道如何解决这个问题。
速度有多慢?你使用了什么引擎? – 2011-03-29 13:29:47
@ f00查询运行3-5秒,我正在使用innodb(可以在标签中看到) – 2011-03-29 13:51:51
也许检查我的例子 - 这是重要的聚类PK的顺序。 – 2011-03-29 13:57:12