3

私は次のクエリを持っています:

SELECT * 
FROM   products 
   INNER JOIN product_meta 
           ON products.id = product_meta.product_id 
   JOIN sales_rights 
     ON product_meta.product_id = sales_rights.product_id 
WHERE  ( products.categories REGEXP '[[:<:]]5[[:>:]]' ) 
   AND ( active = '1' ) 
   AND ( products.show_browse = 1 ) 
   AND ( product_meta.software_platform_mac IS NOT NULL ) 
   AND ( sales_rights.country_id = '240' 
          OR sales_rights.country_id = '223' ) 
GROUP  BY products.id 
ORDER  BY products.avg_rating DESC
LIMIT  0, 18;

ORDER BYセクションを省略してクエリを実行すると、クエリは約90ミリ秒で実行され、ORDER BYセクションとクエリには約8秒かかります。

私はSOを閲覧しましたが、これの理由は、すべてのデータが返される前に並べ替えが実行されているためである可能性があり、代わりにORDER BY結果セットで実行する必要があることがわかりました。(この投稿を参照してください:ORDER BYを使用するとクエリが遅くなります

しかし、私はこれをどのように行うかについての決定的な方法を完全に理解することはできませんか?

4

3 に答える 3

1

私はSOを閲覧しましたが、この理由は、すべてのデータが返される前に並べ替えが実行されているためである可能性があり、代わりに結果セットに対してORDERBYを実行する必要があることがわかりました。

信じがたいことですが、それが問題なら、こういうことをする必要があると思います。(私がparensを置いた場所に注意してください。)

select * from
(
  SELECT products.id, products.avg_rating 
  FROM   products 
  INNER JOIN product_meta 
          ON products.id = product_meta.product_id 
  JOIN sales_rights 
    ON product_meta.product_id = sales_rights.product_id 
  WHERE  ( products.categories REGEXP '[[:<:]]5[[:>:]]' ) 
   AND ( active = '1' ) 
   AND ( products.show_browse = 1 ) 
   AND ( product_meta.software_platform_mac IS NOT NULL ) 
   AND ( sales_rights.country_id = '240' 
          OR sales_rights.country_id = '223' ) 
  GROUP  BY products.id 
) as X
ORDER  BY avg_rating DESC
LIMIT  0, 18;

また、質問を編集して、そのアドバイスへのリンクを含めます。私たちの多くはそれを読むことで恩恵を受けると思います。


追加の、おそらく無関係な問題

WHERE句で使用されるすべての列は、おそらく何らかの方法でインデックス付けする必要があります。複数列のインデックスは、この特定のクエリのパフォーマンスが向上する可能性があります。

列products.categoriesには、正規表現でフィルタリングした複数の値が格納されているようです。通常、1つの列に複数の値を格納することはお勧めできません。

MySQLGROUP BYは不確定です。を使用する標準のSQLステートメントでGROUP BYは、返される行が少なくなり、返される行が速くなる可能性があります。

于 2012-11-30T12:34:34.953 に答える
0

可能であれば、クエリがより高速に実行されるように、ID列にインデックスを付けることをお勧めします。これはSQLソリューションではなく、DBAレベルのソリューションです。データベースを調整すると、全体的なパフォーマンスが向上します。

于 2012-11-30T13:56:00.530 に答える
0

このクエリのインスタンスでの問題は、クエリでGROUP BYとを使用することにより、と式が異なるORDER BY場合、MySQLがインデックスを使用できないことでした。GROUP BYORDER BY

関連読書:

于 2012-12-04T23:44:23.213 に答える