0
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

表 - 总记录约

斑点 - 200

masters_keywrods_nton - 1300

master_search_log_tbl - 4800

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

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

我觉得有一些更好的方法来进行加入和计数?

4

1 回答 1

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,'%')) - 修复它会给你带来最大的性能改进并修复潜在的功能错误代码。(使用全文索引可能会提供暂时的缓刑)。

于 2013-02-15T12:29:14.183 回答