2017-03-21 44 views
0

SQLクエリを最適化しようとしていますが、GROUP BYとORDER BYを組み合わせる最善の方法についての専門家の意見がありますMYSQLの+グループ別の注文...最速の方法ですか?

基本的に私は製品表から最低価格を選択し、商人の名前で

これは私の元のクエリた:

select p.*, m.*, d.* from datafeeds as d, products as p left outer join meta as m on p.mykey = m.mykey where p.datafeed_id = d.id and (match(p.name) against ('+asics +"gel" -women*' in boolean mode)) and p.datafeed_id = '35' and p.is_custom = 0 group by d.merchant_name order by d.merchant_name limit 50

そして、ORDER BYが働いていなかった、私は、グループ化された製品ではなく、最低の価格を持つものを得ていました。

他の議論を読んだ後、私は改善し、クエリを思い付いた:

SELECT p . * , m . * , d . * 
FROM datafeeds AS d, products AS p 
INNER JOIN (

SELECT MIN(display_price) AS MinPrice 
FROM products AS p 
WHERE 1 =1 
AND (

MATCH (
p.name 
) 
AGAINST (
'+asics +"gel" -women*' 
IN BOOLEAN 
MODE 
) 
) 
AND p.datafeed_id = '35' 
AND p.is_custom =0 
GROUP BY merchant_name 
) AS p2 ON p.display_price = p2.MinPrice 
LEFT OUTER JOIN meta AS m ON p.mykey = m.mykey 
WHERE p.datafeed_id = d.id 
AND (

MATCH (
p.name 
) 
AGAINST (
'+asics +"gel" -women*' 
IN BOOLEAN 
MODE 
) 
) 
AND p.datafeed_id = '35' 
AND p.is_custom =0 
GROUP BY d.merchant_name 
ORDER BY d.merchant_name 
LIMIT 50` 

クエリは、正しい結果を取得しますが、それはかなり遅いです。 より良い方法がありますか?事前に

おかげ

答えて

0

あなたはこの

SELECT   p.*, 
       m.*, 
       d.* 
FROM   datafeeds AS d, 
       ( 
         SELECT * 
         FROM  products 
         WHERE 1 = 1 
         AND  ( 
              MATCH (name) against ('+asics +"gel" -women*' IN boolean mode)) 
         AND  datafeed_id = '35' 
         AND  is_custom =0 
         ORDER BY merchant_name, 
            display_price) AS p 
LEFT OUTER JOIN meta        AS m 
ON    p.mykey = m.mykey 
WHERE   p.datafeed_id = d.id 
GROUP BY  d.merchant_name 
ORDER BY  d.merchant_name 
LIMIT   50 
+0

はあなたチュン感謝試みることができる...スピードは多かれ少なかれ同じですが、SQLは、あなたがどのように多くのレコードを持っています – giulio

+0

たくさんきれいに見えますテーブル製品?あなたがp - (....)AS pとしてエイリアスされたサブクエリを実行するだけであれば、それは速いか遅いですか? –

+0

約300.000件レコード...クエリ実行に0.0536秒かかりました... 0.0593 – giulio

関連する問題