2017-02-22 99 views
-1

我有以下的MySQL查询,它将需要超过421ms我该如何优化?如何提高此查询的性能?

SELECT j.*, c.cl_business_name, c.cl_short_name, 
     m.me_last_name, m.me_first_name, o.co_name, j.jo_deleted_date 
FROM clients c, companies o, jobs j 
LEFT JOIN members m ON j.me_id = m.me_id 
WHERE ? AND j.jo_deleted = ? AND j.co_id = o.co_id AND j.cl_id = c.cl_id 
ORDER BY jo_deleted_date DESC 
+1

您是否创建了索引? – Rahi

+1

为一百万行421毫秒是不错的。尽管你可以展示你的餐桌设计和解释计划。 –

+1

1.请提供完整的查询以替换。还请提供该查询的解释结果。 3.还提供索引列表以及您在查询中的表格上定义的列名称。你确定不到半秒的运行时间是不好的? – Shadow

回答

-1

你需要一个条件为你的连接(默认mysql使用内连接)在这个位置。这些公司和客户之间没有关系。应该是这样的:“INNER JOIN公司o ON o.id = c.companiesId”。

要加快查询速度,请从较小的表中的最大值加入。

我只能猜测这个关系是什么样子,但是这个查询应该可以帮助你完成。

我可以想象,这是原因,对于这个响应时间!

SELECT 
    j.*, 
    c.cl_business_name, 
    c.cl_short_name, 
    m.me_last_name, 
    m.me_first_name, 
    o.co_name 
    [, j.jo_deleted_date -> can be ignored, is already in j.* included] 
FROM clients c 
INNER JOIN jobs j ON j.cl_id = c.cl_id AND j.jo_deleted = ? 
INNER JOIN companies o ON j.co_id = o.co_id 
LEFT JOIN members m ON j.me_id = m.me_id 
WHERE ? 
ORDER BY jo_deleted_date DESC 
+0

你的查询有语法错误.. –

+1

我同意显式连接语法比隐式更好,但是,就查询性能而言,几乎没有任何区别。当存在差异时,通常是由于不了解显式连接在from子句中逗号运算符的优先级。公司和客户之间不必有直接的关系,它们通过工作表链接在一起。 – Shadow