我遇到了一个非常大的问题,它源于一张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
有没有更好的方法来解决这个问题?
谢谢大家!
迪伦
答案 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时,可能会更改数据库的总和,但这实际上取决于您更改它们的频率... 否则你可以尝试只做一次总和...... 但是如果你有一把钥匙,我不明白你为什么只在一张桌子上做订单......