我有两张桌子:
表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? (即影响联合订单的顺序,与其加入的表中的字段无关)
答案 0 :(得分:1)
保证MySQL排序的唯一方法是使用order by
或group by
。
您的问题是:有没有办法在我的桌子上定义索引以避免filesort
?
如果你有where
条款明确选择一个客户,并且你有orders(customerid, orderid)
的索引,那么你可能会有一些运气。您正在寻找的查询计划是对orders
索引的扫描,其中过滤器逐行应用于索引。这样的查询计划在理论上似乎是可能的,问题是如何让MySQL使用它。