[英]Why is this mySQL query extremely slow?
給定的是名為“orders_products”的mySQL表,其中包含以下相關字段:
這兩個字段都已編入索引。
我正在運行以下查詢:
SELECT products_id, count( products_id ) AS counter
FROM orders_products
WHERE orders_id
IN (
SELECT DISTINCT orders_id
FROM orders_products
WHERE products_id = 85094
)
AND products_id != 85094
GROUP BY products_id
ORDER BY counter DESC
LIMIT 4
此查詢需要很長時間,大約20秒。 否則數據庫不是很忙,並且在其他查詢上表現良好。
我想知道,是什么導致查詢這么慢?
該表相當大(大約150萬行,大小約為210 mb),這可能是一個內存問題嗎?
有沒有辦法確切地告訴我們SQLSQL需要這么長時間?
解釋輸出:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY orders_products range products_id products_id 4 NULL 1577863 Using where; Using temporary; Using filesort
2 DEPENDENT SUBQUERY orders_products ref orders_id,products_id products_id 4 const 2 Using where; Using temporary
使用WHERE ID IN (subquery)
與mysql的表現非常糟糕。
但是,對於大多數此類查詢的情況,可以將它們重寫為JOIN
,這一點也不例外:
SELECT
t2.products_id,
count(t2.products_id) AS counter
FROM orders_products t1
JOIN orders_products t2
ON t2.orders_id = t1.orders_id
AND t2.products_id != 85094
WHERE t1.products_id = 85094
GROUP BY t2.products_id
ORDER BY counter DESC
LIMIT 4
如果要返回沒有其他產品的行(並顯示零計數),請將連接更改為LEFT JOIN
。
注意表的第一個實例如何具有WHERE products_id = X
,它允許索引查找並立即減少行數,表的第二個實例具有目標數據,但它在id字段上查找(再次快速),但在連接條件下過濾以計算其他產品。
試一試:
!=
條件,這很難處理 - 您是否可以縮小產品范圍並使用多個查找而不是不公平比較?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.