2014-07-01 50 views
0

我有一个使用大约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 

请帮忙。

+0

你知道的_magic power_ [选择解释(http://dev.mysql.com/doc/refman/5.0/en/explain-output.html)? – s1lv3r

+0

第一个查询使用不必要的左连接,并在'WHERE'中重复每个连接条件。第二个更糟。如果没有连接条件,所有这些表中的每一行都会得到一个笛卡尔乘积,只有在WHERE中被过滤。 – shmosel

+0

你能告诉我你的订单吗? 该表的主键是什么? – wrecklez

回答

0

您将覆盖WHERE条款中的ON条件。

变化是:

WHERE (p.order_id = r.order_id 
    AND r.product_id = p.product_id) 
AND (l.license_status_id = r.license_status_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 

WHERE r.license_status_id = '7' 
AND r.validity > 0 
ORDER BY r.end_date ASC LIMIT 0,10 
0

你可以试试这个代码?尽快回复如果没有帮助

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 
    LEFT JOIN customer C 
    ON C.customer_id = R.customer_id 
    LEFT JOIN order_product P 
    ON P.order_id = R.order_id 
     AND P.product_id = R.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.customer_id 
WHERE R.validity > 0 
    AND R.license_status_id = 7 
GROUP BY R.order_license_id 
ORDER BY R.end_date LIMIT 10 
+0

感谢您的帮助,但所花的时间与我的几乎相同。 – seopower