关于如何让这个查询更快地运行的任何建议?
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都在表格中编入索引。
答案 0 :(得分:0)
您正在进行内部联接,如果索引正确,则应该快速进行,匹配'%test%'上的左联接可能是花费时间的地方。
它将通过你的最大60k行,(你正在选择所有列),当它到达字段agname时,它必须遍历字符串以匹配字符串中的单词test 60,000次。我会说优化'%test%',如果现在有这个......你可以
appphone - 有多少种不同的场景 -
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不为空,如前所述。
答案 1 :(得分:0)
我会尝试:
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
输出。