我有一个使用大约6桌,所有2个表中有超过4000条记录MySQL的SELECT查询,我使用的查询是:如何提高多表SELECT查询?
SELECT DISTINCT r.*,
p.name AS product,
p.price,
p.tax,
l.name AS license_status,
CONCAT(c.firstname, ' ', c.lastname) AS customer,
CONCAT(cc.firstname, ' ', cc.lastname) AS license_customer,
cc.telephone AS license_customer_mobile
FROM order_license r
LEFT JOIN customer c ON (c.customer_id = r.customer_id)
LEFT JOIN order_product p ON (p.order_id = r.order_id
AND r.product_id = p.product_id)
LEFT JOIN license_status l ON (l.license_status_id = r.license_status_id)
LEFT JOIN customer cc ON (cc.customer_id = r.license_customer_id)
WHERE r.license_status_id = '7'
AND r.validity > 0
ORDER BY r.end_date ASC LIMIT 0,10
问题是其采取大约1分钟,以显示记录,对于如此少量的记录来说非常高。 MySql服务器是一个相当快的Linode VPS。现在我不知道出了什么问题。
我试图添加索引和删除左连接(如下面的查询中给出的),但结果几乎相同。
SELECT r.*,
p.name AS product,
p.price,
p.tax,
l.name AS license_status,
CONCAT(c.firstname, ' ', c.lastname) AS customer,
CONCAT(cc.firstname, ' ', cc.lastname) AS license_customer,
cc.telephone AS license_customer_mobile
FROM order_license r,
order_product p,
license_status l,
customer c,
customer cc
WHERE (p.order_id = r.order_id
AND r.product_id = p.product_id)
AND (l.license_status_id = r.license_status_id)
AND (c.customer_id = r.customer_id)
AND (cc.customer_id = r.license_customer_id)
AND r.license_status_id = '7'
AND r.validity > 0
ORDER BY r.end_date ASC LIMIT 0,10
请帮忙。
你知道的_magic power_ [选择解释(http://dev.mysql.com/doc/refman/5.0/en/explain-output.html)? – s1lv3r
第一个查询使用不必要的左连接,并在'WHERE'中重复每个连接条件。第二个更糟。如果没有连接条件,所有这些表中的每一行都会得到一个笛卡尔乘积,只有在WHERE中被过滤。 – shmosel
你能告诉我你的订单吗? 该表的主键是什么? – wrecklez