如何优化这个mysql 3表连接查询?

时间:2013-02-15 10:53:46

标签: mysql query-performance

SELECT 
  a.idmotcle,
  a.motcle, 
  count(DISTINCT c.id) as 'Programs',
  count(DISTINCT d.id) as 'Searches',
  FORMAT(count(DISTINCT d.id)/count(DISTINCT c.id),2) as 'S/P'

FROM motcle a
INNER JOIN motcle b 
     ON b.idmotcle=a.idmotcle AND a.archive=0
LEFT JOIN masters_keywords_nton c 
     ON c.id_motcle=a.idmotcle
LEFT JOIN master_search_log_tbl d 
     ON d.search_string LIKE concat('%',a.motcle,'%')
GROUP BY a.idmotcle
ORDER BY a.motcle

表 - 总记录约

motcle - 200

masters_keywrods_nton - 1300

master_search_log_tbl - 4800

我已经在ON子句中使用的所有字段都有索引。

当我在生产中运行查询时,查询当前需要62.887秒。

我觉得有更好的方法来加入和计算?

1 个答案:

答案 0 :(得分:0)

如果您需要有关查询优化的帮助,请提供查询的EXPLAIN计划和CREATE表语句。

了解查询的作用也很重要 - 您应该为查询中的每个短语/表达提供解释。

就像你为什么要在同一领域加入motcle?你为什么使用左连接?为什么要将空值计为匹配?

粗略猜测,我怀疑这可能会给你所需要的东西:

SELECT 
  a.idmotcle,
  a.motcle, 
  count(DISTINCT c.id) as 'Programs',
  count(DISTINCT d.id) as 'Searches',
  FORMAT(count(DISTINCT d.id)/count(DISTINCT c.id),2) as 'S/P'
FROM motcle a
INNER JOIN masters_keywords_nton c 
 ON c.id_motcle=a.idmotcle
INNER JOIN master_search_log_tbl d 
 ON d.search_string LIKE concat('%',a.motcle,'%')
WHERE a.archive=0
GROUP BY a.idmotcle
ORDER BY a.motcle

但是这里明显的WTF是你的数据没有被规范化(d.search_string LIKE concat('%',a.motcle,'%')) - 修复这将给你最大的性能提升并修复潜在的功能代码中的错误。 (使用全文索引可能会提供临时缓存)。