繁体   English   中英

在MySQL中提高查询性能?

[英]Increase the Performance of Query In Mysql?

SELECT resumeid, FirstName, LastName, Mobile, State, EmailId, Role,
       Skill, Relocation, EmpType, ImmType, TotalExp, Buzzwords 
    from Resume r 
    where DetailsCaptured='Y' 
      and resumeid IN (
               SELECT resumeid FROM Resume_Attachment ra
                   WHERE MATCH (ResumeTextContent)
                   AGAINST ('+"quality"' in boolean mode) ) 
    order by UpdatedDate desc
    limit 100

对于不相关的子查询,最好使用JOIN不是INEXISTS 无论如何,至少在旧版本中, IN ( SELECT ... )具有糟糕的性能。

如果这是“惰性评估”的尝试,则由于WHERE中的额外测试,将无法使用。

因此,让我们简化查询:

SELECT  resumeid, FirstName, LastName, Mobile, State, EmailId,
        Role, Skill, Relocation, EmpType, ImmType, TotalExp, Buzzwords
    FROM  Resume r
    WHERE  DetailsCaptured='Y'
      AND  MATCH (ResumeTextContent) AGAINST ('+"quality"' in boolean mode) )
    ORDER BY  UpdatedDate desc
    LIMIT  100

优化器将

  1. 首先进行FULLTEXT查找; 这很快速,但是可能会返回100个以上的resumeid值;
  2. 到达在步骤1中找到的行(我假设resumeid是PRIMARY KEY-提供SHOW CREATE TABLE总是有帮助的。)
  3. 忽略所有与WHERE其余部分不匹配的内容-DetailsCaptured ='Y';
  4. 排序( ORDER BY
  5. 剥去100行。

您将不会比这更快—除非您可以“知道”“大多数”行都包含“质量”。

作为@O。 琼斯评论说,无法确定。 索引DetailsCaptured可能会改善您的性能,尽管大多数时间可能会由IN子句和全文搜索占用。

请尝试以下替代方法。

SELECT resumeid, FirstName, LastName, Mobile, State, EmailId, Role, Skill, Relocation, EmpType, ImmType, TotalExp, Buzzwords 
FROM Resume r 
WHERE DetailsCaptured='Y' 
AND EXISTS (SELECT resumeid FROM Resume_Attachment ra WHERE ra.resumeid=r.resumeid AND ResumeTextContent LIKE '%quality%' COLLATE utf8_general_ci) 
ORDER BY UpdatedDate DESC LIMIT 100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM