簡體   English   中英

為什么這個mySQL查詢非常慢?

[英]Why is this mySQL query extremely slow?

給定的是名為“orders_products”的mySQL表,其中包含以下相關字段:

  • products_id
  • orders_id

這兩個字段都已編入索引。

我正在運行以下查詢:

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字段上查找(再次快速),但在連接條件下過濾以計算其他產品。

試一試:

  1. MySQL不會使用子查詢優化IN - 將表連接在一起。
  2. 您的查詢包含!=條件,這很難處理 - 您是否可以縮小產品范圍並使用多個查找而不是不公平比較?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM