问题描述
想咨询您一下,mysql的myisam机制中,一次写到文件中的数据块时多少字节呢?有限制嘛?reclength和length的关系是什么呢?谢谢~int _mi_write_part_record(MI_INFO *info, my_off_t filepos,/* points at empty block */ ulong length,/* length of block */ my_off_t next_filepos,/* Next empty block */ byte **record,/* pointer to record ptr */ ulong *reclength,/* length of *record */ int *flag);/* *flag == 0 if header */上面是myisam写文件的函数声明 问题补充:thxg 写道
解决方案
引用我这里用的mysql是windows下源码编译的,用vs2005编译的,这个调试的话如何做呀?你既然编译了,把对应的dll,exe以及pdb文件复制到相关目录,启动mysqld,然后attach到该进程, 在你关注的文件源码设置断点,即可跟踪。
解决方案二:
在安装目录下一般会有my.inimy-huge.inimy-innodb-heavy-4G.inimy-large.inimy-medium.inimy-small.ini等等一系列文件供参考
解决方案三:
引用您好,mysql在将一条记录插入到数据库的时候是insert执行一次就写一次myd试问嘛?如果是的话是不是用的buffer存储的记录呀?这个 buffer是多少字节的呢?不好意思,我刚刚开始弄,源码很多不大明白,而且搞不清楚具体什么地方的源码是写这个数据文件的,谢谢您这个跟引擎的实现有关。建议debug一下源码。
解决方案四:
可以看看mysql的源码实现,当:length 比 reclength(记录实际长度) 还大 48个字节的时候,需要进行拆分。if (length > *reclength + MI_SPLIT_LENGTH)length应该是记录所占的块的物理长度,有适当冗余空间,以供块的合并分裂使用。而reclength是记录的实际长度。
解决方案五:
reclenght 代表的是 表中一个记录 可以占用的最大长度length就是记录的实际长度http://code.google.com/p/mysql-heap-dynamic-rows/
解决方案六:
没研究过MySQL的源码。凭感觉,这种写处通常都有缓存,MySQL配置中可以指定写入缓存有多大,当缓存数据满了就进行写入。所以这里的数据块大小很可能与MySQL的配置有关。