mysql – 使用更长的字符串更新VARCHAR单元时会发生什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 使用更长的字符串更新VARCHAR单元时会发生什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2235字,纯文字阅读大概需要4分钟。
内容图文
![mysql – 使用更长的字符串更新VARCHAR单元时会发生什么?](/upload/InfoBanner/zyjiaocheng/896/8bbc70dab41a414e86a1fdfbe6456d06.jpg)
假设我在mySQL数据库中有一个类型为VARCHAR(32)的列.
在Spetmeber 1st,我决定存储字符串“tea”,但在9月2日我决定将其更新为“coffee”.
很明显,如果这个表中的所有记录都相互挤压,我们试图将一个记录延长3个字节,那么在这个记录之后出现的所有记录都需要向下移动3个字节.当然,这很荒谬;任何DBMS都无法使用数千个可能的条目.
那么mySQL在这种可能性中究竟做了什么呢?它对TEXT和BLOB类型的行为方式是否相同?
编辑:
在一天之后读完这篇文章后,我意识到这个问题很模糊.这是一个我希望能够解决问题的例子:
假设我有一个表,fav_drinks有两列:
> user_id,这是一个INTEGER
>饮料,这是一个VARCHAR(32)
假装此表在内存中存储如下:
[1,"juice",2,"tea",3,"soda",4,"hot chocolate"]
也就是说,所有记录一个接一个地顺序存储.如果我们需要将用户2最喜欢的饮料从“茶”更新为“咖啡”,理论上我们需要将用户3和4的条目下调.当然,我不认为这是真实的.数据库.
那么,重申一下这个问题,mySQL如何管理一个表条目突然需要更多内存的特定情况?
解决方法:
MySQL的InnoDB以每个16KB的块存储行.在一个区块内,可能会有一些大行或数百个窄行.几乎总是,一个街区有一些空余的房间.当一行中的一列被更改时,该行将被重写在同一个块中(如果可能的话),并且在块内随机移动以腾出空间. (具体细节隐藏在代码中.)
如果添加了太多的文本(或blob或其他),块中没有空间,则会出现“块拆分”.这是原始块中的行在两个块之间分割的位置.
块存储在块的B树排列中. (参见维基百科.)因此,块不一定是连续存储的,但它们可以连续引用.因此,在十亿行表中分割的块与在百行表中大致相同的少量工作.
另一方面是“MVCC”,其继续允许多个事务同时触摸相同的行.这不仅导致用修改后的值替换行,而且实际上挂在行的前一个副本上,直到完成需要它的事务.但同样,一个街区的空闲房间,加上街区拆分,以及BTree组织处理这个问题.
那么,你的下一个问题是关于删除?好吧,如果文本大量缩小,或者一堆行被删除,那么看起来像块可能会缩小很多,甚至可能被清空?是.在这种情况下,InnoDB检查两个相邻的块是否足够小以便组合,并且这样做,从而释放其中一个块以供将来使用. (这个释放的块保存在表空间中,而不是返回给操作系统,因此ibdata1永远不会收缩;等等)
所有这些都发生在幕后,我们不需要担心它.
确实很大的记录:例如,带有1MB数据的MEDIUMTEXT列的行不适合16KB.该怎么办?嗯,笨重的列实际上存储在其他块中,与记录的主要部分分开.这会导致对行的最大大小和一些意外性能问题的一些令人困惑的限制.同样,这是透明处理的,分配单位是16KB.
虽然我在它,但请注意,INDEX的结构基本上与表的结构相同 – 一个16KB块的BTree,它们在封面上播放块分割/合并游戏,因为为行插入添加/删除索引条目/删除.
内容总结
以上是互联网集市为您收集整理的mysql – 使用更长的字符串更新VARCHAR单元时会发生什么?全部内容,希望文章能够帮你解决mysql – 使用更长的字符串更新VARCHAR单元时会发生什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。