数据库引擎如何在内部处理 varchar 列?
对于定义为的列char(100)
,DBMS 在磁盘上分配 100 个连续字节。但是,对于定义为的列varchar(100)
,情况可能并非如此,因为整个要点varchar
是不分配比存储列中实际数据值所需的空间更多的空间。因此,当用户更新包含空的数据库行时varchar(100)
例如,将列设置为由 80 个字符组成的值,这 80 个字符的空间从哪里分配?
看起来varchar
列必须导致实际数据库行产生相当数量的碎片,至少在列值最初插入为空白或 NULL,然后用实际值更新的情况下是如此。与使用 char 类型值(其中存储在行中的列的空间是连续分配的)相比,这种碎片是否会导致数据库查询性能下降?显然使用varchar
与使用 char 相比,会产生更少的磁盘空间,但是在优化查询性能时是否会影响性能,特别是对于在初始插入后频繁更新值的列?
您在问题中做出了很多不一定正确的假设。
任何 DBMS 中列的类型根本不会告诉您有关该数据存储的性质,除非文档明确告诉您数据是如何存储的。如果没有说明,您不知道它是如何存储的,并且 DBMS 可以自由地在不同版本之间更改存储机制。
事实上,一些数据库在内部将 CHAR 字段存储为 VARCHAR,而其他数据库则根据声明的列大小决定如何存储列。有些数据库将 VARCHAR 与其他列一起存储,有些数据库使用 BLOB 数据,有些则实现其他存储。有些数据库在更新列时总是重写整行,而其他数据库则不会。有些填充 VARCHAR 以允许将来进行有限的更新,而无需重新定位存储。
DBMS 负责弄清楚如何存储数据并以快速且一致的方式将其返回给您。令我惊讶的是,有多少人尝试考虑数据库,通常是在检测到任何性能问题之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)