2

我有两张桌子:

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 对它们进行排序,则可以不使用文件排序。

所以问题是:是否有可能(可能是相关的子查询?)在不需要文件排序的情况下获得概述的结果集?(即影响连接订单的顺序,与它们连接的表中的字段无关)

4

1 回答 1

1

在 MySQL 中保证排序的唯一方法是使用order byor group by

你的问题是真的:有没有办法在我的表上定义索引以避免filesort

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

于 2013-06-01T23:45:18.187 回答