如何提高此查询的性能?
问题描述:
我有以下的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
答
你需要一个条件为你的连接(默认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
您是否创建了索引? – Rahi
为一百万行421毫秒是不错的。尽管你可以展示你的餐桌设计和解释计划。 –
1.请提供完整的查询以替换。还请提供该查询的解释结果。 3.还提供索引列表以及您在查询中的表格上定义的列名称。你确定不到半秒的运行时间是不好的? – Shadow