0

次のクエリを最適化しようとしています (40 秒かかります)。

SELECT SQL_CACHE p.product_ID, p.title, p.slug, p.logo, ps.price, ps.sale_price
FROM products p
JOIN products_shops ps ON p.product_ID = ps.product_ID
WHERE p.status =  'active'
AND (
p.site =  '2'
OR p.site =  '3'
)
AND ps.sale_price <>  ''
AND ps.sale_price <>  '0'
AND ps.price <>  ''
AND ps.price <>  '0'
AND ps.sale_price <>  ''
AND ps.sale_price <>  '0'
GROUP BY p.product_ID
ORDER BY p.views DESC 
LIMIT 1060 , 20

MySQL Explain: http://i.stack.imgur.com/e70YF.png

サブクエリとして試しましたが、さらに時間がかかります:

SELECT SQL_CACHE p.product_ID, p.title, p.slug, p.logo, ps.price, ps.sale_price
FROM products_shops ps
LEFT JOIN (
   SELECT product_ID, title, slug, views, logo FROM products 
  WHERE status =  'active'
  AND (site =  '2' OR site =  '3')
  ORDER BY views DESC
) p ON p.product_ID = ps.product_ID
WHERE (ps.sale_price <>  ''
AND ps.sale_price <>  '0'
AND ps.price <>  ''
AND ps.price <>  '0'
AND ps.sale_price <>  ''
AND ps.sale_price <>  '0')
LIMIT 1060 , 20

私のインデックスは: productsインデックス: http://i.stack.imgur.com/nQkLJ.png

products_shopsインデックス: i.stack.imgur.com/UnnmQ.png

また、(product_ID, views) に複合インデックスを作成し、ビュー インデックスを削除しようとしましたが、役に立ちませんでした。productstable にproducts_shopsは 60 万行あり、74 万行あります。

クエリから ORDER BY を削除すると、非常に高速です。views列にインデックスが付けられているにもかかわらず、なぜ遅いのか理解できません。

4

1 に答える 1

0

WHERE 句の条件の多くは、インデックスを持たない列にあるようです。これらの列にインデックスを追加する価値があるかもしれません。次のいずれにもインデックスがありません。

sale_price
price

それぞれに個別のインデックスを付けると、クエリが高速化されます。

于 2013-11-07T12:59:53.957 に答える