显示记录数量的最佳方法?单独的桌子? MySQL查询缓存?从选择查询计数?

时间:2015-09-11 07:43:06

标签: mysql asp.net database-performance query-cache

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

在那里,用户可以通过选择空缺来填补空缺。每个工作都有自己的类别。我想要做的是在每个位置和每个类别前面显示计数器。

我通常会通过使用左连接从查询中获取行计数器来执行此操作。

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

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

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

此网站每日点击次数很多。接近200万。

否则有最好的方法吗?请记住,到目前为止,我不想告诉DB的确切记录。用户不关心这一点。但准确性应该存在于特定时间。

2 个答案:

答案 0 :(得分:1)

每当有人看到某个国家/地区或某个类别时,发出left join + group by个查询并不是一个好主意。这很可能会导致表现不佳。

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

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

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

答案 1 :(得分:0)

每天有200万次查询,您可能还没有遇到麻烦,但要近距离接触。

查询缓存是一个可行的解决方案。对表的每次写入都会使该表的QC中的每个条目无效。除非读取次数远远超过写入次数,否则质量控制是一种浪费。

你说确切的数字不重要吗?然后我建议:

  • 有一个单独的计数表。
  • 有一个后台工作,重述一切,但要注意不要长时间持有任何锁。如果您有复制,请考虑从从站读取并写入主站。
  • 该表只有类别和计数,使其小巧且可缓存(在引擎的常规缓存中,而不是QC中)。

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

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