以下查詢大約需要200秒才能完成。我試圖達到的目標是獲得6筆或更多付款的用戶,他們還沒有下訂單(不同市場有2個訂單表)。即使使用索引,MySQL聲明也非常緩慢
u.id
,ju.id
都是主鍵。
我已將user_id
和order_status
索引合併爲兩個訂單表中的一個索引。如果我在mp_orders
表中刪除加入並加入COUNT()
,則查詢需要8秒才能完成,但使用它需要很長時間。我想我已經索引了我可能擁有的每一件東西,但我不明白爲什麼需要很長時間才能完成。有任何想法嗎?
SELECT
u.id,
ju.name,
COUNT(p.id) as payment_count,
COUNT(o.id) as order_count,
COUNT(mi.id) as marketplace_order_count
FROM users as u
INNER JOIN users2 as ju
ON u.id = ju.id
INNER JOIN payments as p
ON u.id = p.user_id
LEFT OUTER JOIN orders as o
ON u.id = o.user_id
AND o.order_status = 1
LEFT OUTER JOIN mp_orders as mi
ON u.id = mi.producer
AND mi.order_status = 1
WHERE u.package != 1
AND u.enabled = 1
AND u.chart_ban = 0
GROUP BY u.id
HAVING COUNT(p.id) >= 6
AND COUNT(o.id) = 0
AND COUNT(mi.id) = 0
LIMIT 10
支付表
+-----------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+----------------+
| id | bigint(255) | NO | PRI | NULL | auto_increment |
| user_id | bigint(255) | NO | | NULL | |
+-----------------+---------------+------+-----+---------+----------------+
訂單表(mp_orders表幾乎相同的)
+-----------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+----------------+
| id | int(255) | NO | PRI | NULL | auto_increment |
| order_number | varchar(1024) | NO | MUL | NULL | |
| user_id | int(255) | NO | MUL | NULL | |
+-----------------+---------------+------+-----+---------+----------------+
你使用的是服務器端語言嗎? sql不能做數學運算來保存它的'生命'。即使使用php也是最好的。 – 2013-04-10 14:28:01
@JoeCoderGuy是的我正在使用PHP網站,我也通過phpMyAdmin運行相同的SQL語句。 – Wasim 2013-04-10 14:29:17
「EXPLAIN your_query_here」的完整輸出是什麼? – Jocelyn 2013-04-10 14:30:23