2015-09-29 46 views
2

我无法排序两列。Mysql:按两列排序,使用filesort

EXPLAIN SELECT * FROM articles WHERE option <>0 AND deleted=0 ORDER BY 
    date_added DESC, category_id DESC LIMIT 25 OFFSET 500 

ID SELECT_TYPE表类型possible_keys关键key_len裁判行 额外1页简单的文章ALL NULL NULL NULL NULL 437168使用 哪里;使用文件排序

我加了(选项,删除,DATE_ADDED,CATEGORY_ID)

当我用单一指标:

EXPLAIN SELECT * FROM articles WHERE option <>0 AND deleted=0 ORDER BY 
    date_added DESC LIMIT 25 OFFSET 500 

EXPLAIN SELECT * FROM articles WHERE option <>0 AND deleted=0 ORDER BY 
    category_id DESC LIMIT 25 OFFSET 500 

只使用其中

我试过添加索引(选项,删除,date_added,category_id),但它只适用于当我尝试按一列排序。

回答

1

这将是很难让MySQL使用索引这个查询:

SELECT * 
FROM articles 
WHERE option <> 0 AND deleted = 0 
ORDER BY date_added DESC 
LIMIT 25 OFFSET 500 

你可以尝试一个综合指数:articles(deleted, date_added, option)。通过覆盖WHEREORDER BY,MySQL 可能会使用它

如果你可以添加相等性测试(而不是<>)的optionflag列,然后编写查询为:

SELECT * 
FROM articles 
WHERE optionflag = 1 AND deleted = 0 
ORDER BY date_added DESC 
LIMIT 25 OFFSET 500; 

然后在articles(deleted, optionflag, date_added desc)指数将工作做好。

否则一个子查询可能会为你工作:

SELECT a.* 
FROM (SELECT * 
     FROM articles 
     WHERE deleted = 0 
     ORDER BY date_added DESC 
    ) a 
WHERE option <> 0 
LIMIT 25 OFFSET 500; 

这物化中间结果,但它无论如何做一个order by。并且,最终的顺序不能保证在外部查询中出现,但它在实践中确实有效(并且由于实现而接近保证)。