2013-02-15 186 views
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 

表 - 记录总数约如何优化这个mysql 3表连接查询?

motcle - 200

masters_keywrods_nton - 1300

master_search_log_tbl - 4800

我已经在在上使用条款的所有字段的索引。

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

我觉得有一些更好的方式做加盟和计数?

+0

什么是连接表的目的motcle一到motcle B'我没有看到b在哪里使用。 – 2013-02-15 12:24:31

+0

@AndaIancu我正在使用内部联接来过滤a.archive = 0的表 – Matt 2013-02-15 13:38:37

+0

无需内部联接 - 您可以添加where子句'WHERE a.archive = 0'。 – 2013-02-15 13:47:17

回答

0

如果您想查询优化帮助,那么请为查询提供解释计划和CREATE TABLE语句。

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

就像你为什么同一领域加入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是你的数据不会mormalized(d.search_string LIKE CONCAT(“%”,一个.motcle,'%')) - 解决这个问题可以带来最大的性能改进,并修复代码中潜在的功能性错误。 (使用全文索引可能会提供临时缓存)。