-1

我有一个使用 ASP.NET 创建的工作列表站点,DB 是 MYSQL。

在那里,用户可以通过选择将职位空缺放置到国家/地区。每个工作都有自己的类别。我想做的是在每个位置和每个类别的前面显示计数器。

我通常会通过使用左连接从查询中获取行计数器来做到这一点。

那么考虑到性能,这是一个好方法吗?

如果我维护一个单独的表来存储计数器怎么办。如果用户投放广告,计数器将加 1,如果删除或过期,则计数器减 1。请记住,数百万用户同时投放广告。这会导致锁定吗?

我还听说过 MySQL 查询缓存。我对此一无所知。

该网站每天获得许多页面点击量。接近200万。

或者有没有最好的方法来做到这一点?请记住,到目前为止,我不想告诉数据库的确切记录。用户不关心这个。但是准确性应该在特定时间存在。

4

2 回答 2

1

每次有人看到一个国家或一个类别时发出left join+group by查询听起来不是一个好主意。这很可能会导致性能不佳。

MySQL 查询缓存可能会有所帮助,但我不会依赖它。

单独存储计数器将使您的数据非规范化,这可能会导致计数器与实际数据不同步(例如,如果您手动修改工作列表或通过不更新计数器的代码)。

计数器始终精确有多重要?我敢打赌这不是那么重要。因此,我将实现一个应用程序级缓存(例如存储在ASP.NET Application State中),为每个国家和每个类别存储一个计数器。将缓存包装在一个类中,该类将从缓存中获取数据,除非自上次更新以来已经 N 分钟。否则,首先发出数据库查询以使用当前数据更新缓存(请记住用 a 包围此逻辑lock()或使用您选择的其他线程安全机制)。

于 2015-09-11T08:35:02.320 回答
0

每天有 200 万次查询,您可能还没有遇到麻烦,但已经接近了。

查询缓存不是一个可行的解决方案。对表的每次写入都会使该表的 QC 中的每个条目无效。除非读取次数明显多于写入次数,否则 QC 是一种浪费。

你说确切的数字不重要?那我建议:

  • 有一个单独的计数表。
  • 有一份背景工作,讲述所有事情,但要小心不要长时间持有任何锁。如果您有复制,请考虑从从属设备读取并写入主设备。
  • 该表将只有类别和计数,使其小且可缓存(在引擎的常规缓存中,而不是 QC)。

通过将计数从主表中拉出,减少了对主表的影响。

如果您需要进一步的帮助,请提供SHOW CREATE TABLE一个SELECT ... GROUP BY ...将生成所有计数的。这应该为我们提供有关您正在使用的内容的更多详细信息,尽管该查询可能不是直接可行的。

于 2015-09-13T04:53:53.670 回答