MySQL连接行的顺序?

时间:2013-06-01 19:05:38

标签: mysql join

我有两张桌子:

orders包含所有客户的所有订单(简化):

Field       Type             Null    Key    Default Extra
==================================================================
id          int(11)          NO      PRI    NULL    auto_increment  
customerId  int(11)          NO      PRI    NULL    
...

(customerId, id)上有一个唯一索引。

customerindex包含有关客户的信息(简化):

Field       Type             Null    Key    Default Extra
=========================================================
customerId  int(11)          NO      PRI    NULL    
name        varchar(64)      NO      MUL    NULL    
...

name

上有全文索引

现在我想通过他们的名字(使用全文索引)搜索客户并列出他们的订单。

我基本上需要的是这样的事情:

customerX     order5
customerX     order4
...
customerY     order6
customerY     order5
...

对于每个客户,我希望订单按其ID排序,但客户本身的顺序无关紧要

我做的是

SELECT ...
FROM `customerindex` AS `idx`
LEFT JOIN `orders` ON (`orders`.`id` = `idx`.`id`)
WHERE MATCH ... AGAINST ...
ORDER BY `orders`.`customerId`, `orders`.`id` DESC

但当然这需要filesort

如果我只想要一个客户的订单,并希望按订单ID对它们进行排序,则可以不使用filesort。

所以问题是:是否有可能(可能是相关的子查询?)获得概述的结果集而不需要filesort? (即影响联合订单的顺序,与其加入的表中的字段无关)

1 个答案:

答案 0 :(得分:1)

保证MySQL排序的唯一方法是使用order bygroup by

您的问题是:有没有办法在我的桌子上定义索引以避免filesort

如果你有where条款明确选择一个客户,并且你有orders(customerid, orderid)的索引,那么你可能会有一些运气。您正在寻找的查询计划是对orders索引的扫描,其中过滤器逐行应用于索引。这样的查询计划在理论上似乎是可能的,问题是如何让MySQL使用它。