2

私は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です。

1 人の顧客の注文のみが必要で、注文 ID で並べ替えたい場合、これはファイルソートなしで可能です。

したがって、問題は次のとおりです。ファイルソートを必要とせずに概説された結果セットを取得することは、どういうわけか可能ですか (おそらく相関サブクエリですか?)。(つまり、結合されたテーブルのフィールドに関係なく、結合された注文の順序に影響を与えます)

4

1 に答える 1

1

MySQL で順序付けを保証する唯一の方法は、order byまたはを使用することgroup byです。

あなたの質問は本当に: 回避するためにテーブルにインデックスを定義する方法はありますfilesortか?

where1 人の顧客を明示的に選択する句があり、インデックスが にあるorders(customerid, orderid)場合は、運が良いかもしれません。探しているクエリ プランは、ordersインデックスのスキャンであり、フィルターはインデックスから行ごとに適用されます。このようなクエリ プランは理論的には可能のようですが、問題は MySQL でそれを使用する方法です。

于 2013-06-01T23:45:18.187 に答える