当前位置:   article > 正文

events_transactions_history_long表的内存占用

events_transactions_history_long

events_transactions_history_long表用于存储历史的事务信息。通过参数performance_schema_events_transactions_history_long_size来控制最多保留多少条事务记录(包含所有session)

通过操作系统直接查看内存占用来判断events_transactions_history_long表的内存占用不太可行,通过table status来查看也不可行,如下:

           Name: events_transactions_history_long
         Engine: PERFORMANCE_SCHEMA
        Version: 10
     Row_format: Dynamic
           Rows: 10000
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

最好的办法还是从源码入手,了解events_transactions_history_long的存储方式。

events_transactions_history_long中存储的信息和events_transactions_current一样,只不过events_transactions_current是线程当前事务的状态。
events_transactions_history_long的数据保存是使用一个环形数组来完成的,如下:

/** EVENTS_TRANSACTIONS_HISTORY_LONG circular buffer. */
PFS_ALIGNED PFS_events_transactions *events_transactions_history_long_array= NULL;
  • 1
  • 2

这个数组的大小在系统启动时确定好,不可以动态修改,其中初始化的过程如下:

/**
  Initialize table EVENTS_TRANSACTIONS_HISTORY_LONG.
  @param events_transactions_history_long_sizing       table sizing
*/
int init_events_transactions_history_long(uint events_transactions_history_long_sizing)
{
  events_transactions_history_long_size= events_transactions_history_long_sizing;
  events_transactions_history_long_full= false;
  PFS_atomic::store_u32(&events_transactions_history_long_index.m_u32, 0);

  if (events_transactions_history_long_size == 0)
    return 0;

  events_transactions_history_long_array=
    PFS_MALLOC_ARRAY(& builtin_memory_transactions_history_long,
                     events_transactions_history_long_size,
                     sizeof(PFS_events_transactions), PFS_events_transactions,
                     MYF(MY_ZEROFILL));

  return (events_transactions_history_long_array ? 0 : 1);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

通过此函数可以清晰的看出,为了存储历史数据所需要的内存大小,计算得出,每一条记录(PFS_events_transactions)在344个字节,要存储100万记录的话,内存需要300多M。

结构体PFS_events_transactions中虽然包含了部分指针类型的成员,比如它的父类PFS_events中的 const char *m_source_file;

  /** Instrument metadata. */
  PFS_instr_class *m_class;
  
  /** Location of the instrumentation in the source code (file name). */
  const char *m_source_file;
  • 1
  • 2
  • 3
  • 4
  • 5

但其实是指向同一块内存区域的,所以可以忽略。

结论就是:

  • 存储100万记录的话,内存需要328M。
  • 最大设置为1048576,MySQL限制
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/121851
推荐阅读
相关标签
  

闽ICP备14008679号