如何优化此MySQL查询?

时间:2010-11-20 00:01:58

标签: mysql

我遇到了一个非常大的问题,它源于一张50k +记录的表格。

这个表看起来像这样(+15左右的列不太重要):

table_1
date | name | email | num_x | num_y

我还有一个不同数据库(同一服务器)上的另一个表,看起来像这样(+1不重要的列):

table_2
name | comment | status

table_1每天都会更新新条目(它是用于其他项目的供稿表),这意味着有很多重复的“名称”行。这是有意的。 table_2包含有关“name”的注释和状态注释,但不重复“name”。

我需要编写一个查询,从table_1中选择所有“name”,其中所有num_x + num_y>的总和X.所以,例如,如果这是几行......

2010-11-19 | john.smith | john.smith@example.com | 20 | 20  
2010-11-19 | joel.schmo | joel.schmo@example.com | 10 | 10  
2010-11-18 | john.smith | john.smith@example.com | 20 | 20  
2010-11-18 | joel.schmo | joel.schmo@example.com | 10 | 10 

..我需要找到总数为num_x + num_y>的所有“名字”。 50,然后我会回来 john.smith | john.smith@example.com | 80。我还会从其他数据库返回john.smith的状态和评论。

我写了一个我相信工作得很好的查询,但这有问题,因为它需要一整天才能运行。我也成功地从其他数据库中检索记录(我没有在下面列出的记录)。

SELECT        
    name,                                
    email,
    SUM(num_x + num_y) AS total
FROM
    table_1    
GROUP BY
   name
 HAVING
    SUM(num_x + num_y) > 100
ORDER BY
     total ASC

有没有更好的方法来解决这个问题?

谢谢大家!

迪伦

4 个答案:

答案 0 :(得分:1)

尝试:

SELECT         
    name,                                 
    email, 
    num_x + num_y AS total 
FROM 
    table_1     
WHERE
    num_x + num_y > 100 
ORDER BY 
     total ASC 

摆脱分组应该会产生很大的不同。

答案 1 :(得分:1)

为name创建索引,这将提高性能:

ALTER TABLE `table_1` ADD INDEX (`name`); 

但是,重新设计数据库将是我的推荐。为名称创建一个人工密钥,类似于id_name |名字| email,beeing id_name是一个整数auto_increment,这样你就会有更好的表现。

答案 2 :(得分:1)

为什么你在GHAVING中重复总和而不是重复总数?除非我遗漏了某些东西,否则结果没有区别,避免第二笔会节省时间

如果你可以跳过ORDER BY子句并且不介意稍微不同的选择,我认为通过分割总和可以获得一些加速。我有一个小型数据库,并测试了它的有效查询和结果是否正确,但它不足以量化性能差异。

SELECT        
   name,                                
   email,
   SUM(num_x) as sumX, SUM(num_y) AS sumY
FROM
   table_1    
GROUP BY
   name
HAVING
   sumX + sumY > 100

名称上的索引是不费吹灰之力的。这是加速它的最简单的事情。

答案 3 :(得分:0)

每次更改x或y时,可能会更改数据库的总和,但这实际上取决于您更改它们的频率... 否则你可以尝试只做一次总和...... 但是如果你有一把钥匙,我不明白你为什么只在一张桌子上做订单......