Mysql 在数据库中存储日志数据的更好策略是什么?

Mysql 在数据库中存储日志数据的更好策略是什么?,mysql,data-structures,Mysql,Data Structures,我正在构建一个应用程序,它需要大量记录用户的操作、付款等 我最好使用一个整体日志表,然后将所有内容都记录到该表中。。。。或者对于每种类型的操作Im日志记录(日志付款、日志登录、日志acc更改),最好有单独的日志表 例如,当前Im记录用户与支付网关的交互。当他们注册试用时,当试用成为订阅时,当它被重新收费、退款时,是否有失败,等等 我还想开始记录与支付网关不交互的操作或事件(在数据发送到网关进行验证、登录等之前拦截的续订取消、禁令、支付失败等) 编辑: 将定期检查数据,以验证其完整性,因为根据数据

我正在构建一个应用程序,它需要大量记录用户的操作、付款等

我最好使用一个整体日志表,然后将所有内容都记录到该表中。。。。或者对于每种类型的操作Im日志记录(日志付款、日志登录、日志acc更改),最好有单独的日志表

例如,当前Im记录用户与支付网关的交互。当他们注册试用时,当试用成为订阅时,当它被重新收费、退款时,是否有失败,等等

我还想开始记录与支付网关不交互的操作或事件(在数据发送到网关进行验证、登录等之前拦截的续订取消、禁令、支付失败等)

编辑: 将定期检查数据,以验证其完整性,因为根据数据,人们需要获得报酬,因此准确的数据非常关键。读查询将由我和另外两名管理员完成,因此99%的时间都是写/更新


我只是想拥有多个表,只是在处理插入和更新支付数据等关键mysql事务期间创建了更多的故障点。

这取决于日志记录的目的。对于调试和一般监控目的,使用动态日志级别的单个日志表将非常有用,这样您就可以按时间顺序查看系统正在经历的情况

另一方面,出于审计跟踪的目的,没有什么比为每个CRUD操作的所有表提供重复表更好的了。这样,在付款表中捕获的所有信息或在审计表中捕获的任何信息都将被删除


因此,答案是两者都有。

在所有其他条件相同的情况下,较小的不相交表可能具有性能优势,特别是当它们写得很重时(因为与日志相关的表很容易写)——大多数DB机制都可以更好地针对大多数读的、很少写的表进行调优。在编写(以及更新您可能必须维护的任何索引)方面,小型不相交表是一个明显的胜利,尤其是在存在并发性的情况下(当然,这取决于您为表使用的引擎——这在mysql中是一个非常重要的考虑因素!)


在阅读方面,这完全取决于你的查询模式——你需要什么样的查询,以及多久查询一次。在某些情况下,对于您提到的使用模式,复制某些信息可能会有一些性能优势,例如,如果您经常需要用户的贷项或借记的最新运行总计,以及运行总计如何形成的详细可审核日志,保持(逻辑冗余)用户的运行总计表(以及关于各种贷项和借记来源的精确分离的“日志表”)可能是有保证的。

事务表永远不会更改,不可编辑,并且可以作为该类型信息的日志文件。将“账单”表设计为具有时间戳,这就足够了

但是,如果数据记录是可编辑的,则需要跟踪谁在何时更改了什么。要做到这一点,你有两个选择

--

对于给定的,您可以有一个结构几乎相同的表_历史表,该表具有可为空的字段和两部分主键(原始表的主键+序列)。如果对于每个插入或更新操作,您都向该表写入一条记录,则您有一个关于表发生的所有事情的完整日志

此方法的优点是可以为所有记录的数据保留相同的列类型,而且查询效率更高

--

或者,您可以有一个包含“表”、“键”、“日期”、“谁”等字段的日志表,以及一个存储更改的字段和值的相关表

这种方法的优点是,您可以编写一个日志例程并在任何地方使用它

--


我建议您评估表的数量、性能需求、更改量,然后选择一个表并继续使用。

我认为如果您只写日志数据而从不查看它,这并不重要。如果你有规律的分析要做,那么我认为这取决于那是什么。请解释为什么以及为什么要登录。