我有一个使用ASP.NET创建的工作列表网站,DB是MYSQL。
在那里,用户可以通过选择空缺来填补空缺。每个工作都有自己的类别。我想要做的是在每个位置和每个类别前面显示计数器。
我通常会通过使用左连接从查询中获取行计数器来执行此操作。
考虑到性能,这是一个好方法吗?
如果我维护一个单独的表来存储计数器怎么办?如果用户放置广告,则计数器将增加1,如果删除或过期,则计数器减少1.请记住有数百万用户同时投放广告。这会导致锁定吗?
我也听说过MySQL查询缓存。我对此一无所知。
此网站每日点击次数很多。接近200万。
否则有最好的方法吗?请记住,到目前为止,我不想告诉DB的确切记录。用户不关心这一点。但准确性应该存在于特定时间。
答案 0 :(得分:1)
每当有人看到某个国家/地区或某个类别时,发出left join
+ group by
个查询并不是一个好主意。这很可能会导致表现不佳。
MySQL查询缓存可能会有所帮助,但我不会依赖它。
单独存储计数器会使数据非规范化,这可能会导致计数器与实际数据不同步(例如,如果手动或通过不更新计数器的代码修改作业列表)。
计数器始终精确到底有多重要?我打赌它并不那么重要。因此,我将实现一个应用程序级缓存(例如存储在ASP.NET Application State中),为每个国家和每个类别存储一个计数器。将缓存包装在将从缓存中获取数据的类中,除非它自上次更新以来已经过N分钟。否则,首先发出数据库查询以使用当前数据更新缓存(请记住使用lock()
包围此逻辑或使用您选择的其他线程安全机制。)
答案 1 :(得分:0)
每天有200万次查询,您可能还没有遇到麻烦,但要近距离接触。
查询缓存不是一个可行的解决方案。对表的每次写入都会使该表的QC中的每个条目无效。除非读取次数远远超过写入次数,否则质量控制是一种浪费。
你说确切的数字不重要吗?然后我建议:
通过从主表中拉出计数,减少对主表的影响。
如果您需要进一步的帮助,请提供可生成所有计数的SHOW CREATE TABLE
和SELECT ... GROUP BY ...
。这应该为我们提供有关您正在使用的内容的更多详细信息,尽管该查询可能不直接可行。