次のクエリを最適化しようとしています (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) に複合インデックスを作成し、ビュー インデックスを削除しようとしましたが、役に立ちませんでした。products
table にproducts_shops
は 60 万行あり、74 万行あります。
クエリから ORDER BY を削除すると、非常に高速です。views
列にインデックスが付けられているにもかかわらず、なぜ遅いのか理解できません。