关于如何让这个查询运行得更快有什么建议吗?
SELECT *, p.*
FROM grouped g
INNER JOIN form p
on p.id = g.id
LEFT JOIN prospect ps
ON (p.appphone = phone_bus OR p.appphone = phone_res OR p.appphone = phone_fax) AND p.appphone != ''
WHERE p.agname like '%test%'
ORDER BY p.agname DESC
limit 0, 100
如果我将 ON 更改为不使用 OR 它运行得很快。像这样需要30-40秒。
p.appphone、phone_bus、phone_res、phone_fax 和 p.agname 都在表中编制索引。
您正在执行内部连接,如果索引正确,该连接应该会很快,匹配项"%test%"上的左侧连接可能是它需要时间的地方。
它正在遍历您的最大 60k 行(您正在选择所有列),当它到达字段 agname 时,它必须遍历字符串以匹配字符串中某处的单词测试60,000 次。我会说优化"%test%",如果没有办法解决这个问题......你可以
应用程序 - 有多少种不同的场景 -
ON (**p.appphone = phone_bus OR p.appphone = phone_res OR p.appphone = phone_fax**) AND p.appphone != ''
你可以加入键,然后在 WHERE 子句中使用嵌套的 OR 语句,不是吗?
也许你可以说 p.appphone <> phone_print在哪里或包含这个嵌套 OR 语句的东西,但对其进行优化,以便它只查找它不是的内容,而不是它可能是什么的三个不同实例......另外,p.appphone 真的 = '' 还是空?不确定它会加快多少,但你可以说 p.appphone 在左侧加入的地方不为空,如前所述。
我会尝试:
- 使用
ANY
运算符; - 将
p.appphonne != ''
移至WHERE
条款; - 精确的
SELECT
列表,'cos*
已经包括p.*
字段。
请尝试以下查询:
SELECT *, p.*
FROM grouped g
JOIN form p ON p.id = g.id
LEFT JOIN prospect ps
ON p.appphone = ANY(ps.phone_bus, ps.phone_res, ps.phone_fax)
WHERE p.agname LIKE '%test%'
AND p.appphone != ''
ORDER BY p.agname DESC
LIMIT 0, 100;
请在第一条消息中包含查询EXPLAIN
输出。