0

关于如何让这个查询运行得更快的任何建议?

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 都在表中进行了索引。

4

2 回答 2

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 语句,不是吗?

也许您可以说 where p.appphone <> phone_print 或将包含此嵌套 OR 语句的内容,但对其进行了优化,因此它只是查找它不是什么而不是它可能是什么的三个不同实例...。 p。 appphone真的=''还是为空?不确定它究竟会快多少,但你可以说 p.appphone 在左连接上的位置不为空,如前所述。

于 2012-06-13T19:42:41.663 回答
0

我会尝试:

  1. 使用ANY运算符;
  2. 进入p.appphonne != ''WHERE条款;
  3. 精确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在您的第一条消息中包含查询的输出。

于 2012-06-13T19:56:50.240 回答