数据库底层存续还是通过文件,那修改字段值,映射到文件是怎么操作的?

0o涛涛o0 发布于 07/10 10:12
阅读 166
收藏 0

文件中如果我要修改某一个字段,貌似我记得修改文件中间某一行的值需要重写整个文件,因为文件只能追加写,无法中间插入吧,Mysql这块是怎么优化的呢,采用什么策略,也是重写整个文件嘛

加载中
1
蓝水晶飞机
蓝水晶飞机

一个数据库几个GB甚至几百GB、更大的几个TB以上,重写整个数据文件要多大的IO速度?

“修改文件中间某一行的值” 可能只是更新数据文件里面的一小块数据而已。

可能是利用 文件随机读写 的方式实现的,在磁盘上的数据都是有结构的(比如说数据表有数据表的结构、每一个列、行都有固定的大小),首先先计算好要更新的数据块的偏移地址和数据块的大小,然后通过 seek 移动指针 和 write 实现覆盖更新文件的数据。

0o涛涛o0
0o涛涛o0
很有道理,通过固定数据字节数,更新字段只要算到字节数,把指针移动过去就行。Thanks
0
0o涛涛o0
0o涛涛o0

居然没人看我帖子。。。呜呜

0
蓝水晶飞机
蓝水晶飞机

为什么数据表里面每一个字段都有指定一个大小呢?

常见比如:varchar(50)、bigint、char(50)等。

其实,这就跟数据结构有关,数据库数据表需要一个确切的数据结构,varchar(50) 最大存储50个char(至于可变长度可能只是一个设计的特性而已,后面空白的存储空间都是填充0),bigint最大存储2^64-1(8个字节),char(50) 就和varchar(50)类似,不过他是比较死板的,空白的字符都给你返回来。

varchar(50)、bigint、char(50) 其实在实际存储的数据结构中,可能还会比这个所需的数据存储字节更大,因为需要额外的数据来做描述。

 

以上均是本人乱说,对于数据库源码没有研究过,仅供娱乐参考。

0
魔力猫
魔力猫

数据存储除了文件,还有裸设备、Oracle ASM等等。具体可以看各家的文档,有结构的基本说明。不过更深就是人家的独家秘方了。

魔力猫
魔力猫
回复 @蓝水晶飞机 : 当然了。Oracle的ASM了解一下。
蓝水晶飞机
蓝水晶飞机
哈哈哈,难不成还有数据库专用的FileSystem或者RAW设备么。
返回顶部
顶部