我有这些疑问:
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存储在表中并在数据更改时更新该表可能会提高性能。但这违反了正常化......
请帮我解决这两个问题......
由于
答案 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数据库存储各个行。