使用big-table-join优化查询

时间:2014-10-03 10:43:13

标签: php mysql sql database database-design

我有一张大桌子。

让我们称之为“独角兽”。

第二桌'农民'

结构:

农民

  • ID
  • 名称
  • ...更多领域

独角兽

  • ID
  • farmer_id
  • ...更多领域

还有查询:

SELECT
  f.id,
  f.name,
  COUNT(*)
FROM
  farmers f 
LEFT JOIN unicorns u 
ON u.farmer_id = f.id 
GROUP BY f.id

当然,表格确实不是这样命名的,而是有更多的字段等。但是我在这个例子中只留下了最重要的东西。

问题是系统在增长,并且有太多的独角兽。数以百万计。

此查询(如此)在农民列表页面上执行。

并且页面加载速度不如以前那么快,因为每次加载页面时我们都会加入一个数百万的表。

问题是:

  • 我们确实需要在列表中显示每个农民的独角兽数量。
  • 我们需要提高页面加载速度。

如果您需要优化此项,您将如何实现此结果?

你会推荐什么?

P.S。

我个人认为我需要从主查询中排除big-table-join,单独计算unicorns计数并将它们存储在缓存存储中,一次又一次地重新计算它们。也许有最好的方式,所以我想听别人的意见。

1 个答案:

答案 0 :(得分:2)

我会在农民桌上为NumberUnicorns添加一个额外的专栏并将其存储在那里。然后,通过一些数据库触发器,当一条记录被添加到独角兽表时,它只是用新记录中的相应计数更新农民表。如果删除了独角兽记录,还要考虑更新计数。然后,您的查询立即从农民表中完成。