MySQL查询计算列

时间:2011-10-05 12:21:34

标签: mysql sql performance calculated-columns

我有这些疑问:

SELECT a.Id, a.Name, (SELECT COUNT(Id) FROM b WHERE b.IdTableA = a.Id) AS Num
FROM a
ORDER BY a.Name

表b在表a上有一个FK(IdTableA) 在这种情况下,它是否有效?还有其他办法吗?

另一个问题是:

SELECT client.Id, client.Name
     ,(SELECT SUM(projects) FROM projects WHERE IdClient = client.Id) AS projects
FROM client

这个怎么样?

有时我们需要使用多个计算列(SELECT SUM),甚至10或15。

我们非常担心性能,因为表项目可能有超过500K的记录。

我已经读过将这些SUMS存储在表中并在数据更改时更新该表可能会提高性能。但这违反了正常化......

请帮我解决这两个问题......

由于

1 个答案:

答案 0 :(得分:2)

SELECT a.Id, a.Name, (SELECT COUNT(Id) FROM b WHERE b.IdTableA = a.Id) AS Num
FROM a
ORDER BY a.Name

可以改写为

SELECT a.Id, a.Name, COUNT(b.Id) AS Num
FROM a JOIN b ON b.IdTableA = a.Id 
GROUP BY a.Id, a.Name
ORDER BY a.Name

这样可以降低MySQL被错误执行的风险。

如果读取次数多于写入次数(或者允许写入速度较慢,但​​读取速度必须很快),则可以存储数据总和以便于检索。通常,您可以使用数据仓库:仓库存储聚合数据,OLTP数据库存储各个行。