mysql速度问题

时间:2012-06-13 19:27:54

标签: mysql

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

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都在表格中编入索引。

2 个答案:

答案 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)

我会尝试:

  1. 使用ANY运营商;
  2. p.appphonne != ''移入WHERE子句;
  3. 精确SELECT列表,'cos *已包含p.*字段。
  4. 请尝试此查询:

    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输出。