百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL数据行溢出的深入了解
分享文章到:

MySQL数据行溢出的深入了解

发布时间:08/01 来源:未知 浏览: 关键词:
本篇文章给大家带来的内容是对于MySQL数据行溢出的深入了解,有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。 本篇文章给大家带来的内容是对于MySQL数据行溢出的深入了解,有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

一、从常见的报错提及

故事的开头我们先来看一个常见的sql报错信息:

接着再来说一下innodb_page_size设定成不一样值的关于mysql机能上的影响,测试的表含有1亿笔记录,文件大小30G。

①读写场景(50%读50%写)

16K,对CPU压力较小,均匀在20%

8K,CPU压力为30%~40%,但select吞吐量要高于16K

②读场景(100%读)

16K和8K差别不显明

InnoDB Buffer Pool治理页面自身也有代价,Page数越多,那么雷同大小下,治理链表就越长。因而当我们的数据行自身就比拼长(大块插入),更大的页面更有益于提拔速度,由于一个页面可以放入更多的行,每个IO写的大小更大,可以更少的IOPS写更多的数据。 当行长超过8K的时候,要是是16K的页面,就会强迫转换一些字符串类型为TEXT,把字符串主体转移到扩展页中,会致使读取列需要多一个IO,更大的页面也就支撑了更大的行长,64K页面可以支撑近似32K的行长而不消运用扩展页。 但是要是是短小行长的随机读取和写入,则不适合运用这么大的页面,这会致使IO效率下落,大IO只能读取到小局部。

2、对于Row_format

Innodb存储引擎保留记载,是以行的情势寄存的。在InnoDB 1.0.x版本以前,InnoDB 存储引擎供给了 Compact 和 Redundant 两种格局来寄存行记载数据。MySQL 5.1 中的innodb_plugin 引入了新的文件格局:Barracuda,该文件格局具有新的两种行格局:compressed和dynamic。而且把 compact 和 redundant 合称为Antelope。可以通过下令SHOW TABLE STATUS LIKE 'table_name';来查看目前表运用的行格局,其中 row_format 列表示目前所运用的行记载构造类型。

MySQL 5.6 版本中,默许 Compact ,msyql 5.7.9 及今后版本,默许行格局由innodb_default_row_format变量决议,默许值是DYNAMIC,也可以在 create table 的时候指定ROW_FORMAT=DYNAMIC(通过这个可动态调整表的存储格局)。要是要修改现有表的行模式为compressed或dynamic,必需先将文件格局设定成Barracuda(set global innodb_file_format=Barracuda;)。再用ALTER TABLE tablename ROW_FORMAT=COMPRESSED;去修改才干生效,不然修改无效却无提醒。

①compact

要是blob列值长度 <= 768 bytes,不会发生行溢出(page overflow),内容都在数据页(B-tree Node);如果列值长度 > 768字节,那么前768字节仍然在数据页,而剩余的则放在溢出页(off-page),如下图:

dynamic行格局,列存储可否放到off-page页,主要取决于行大小,它会把行中最长的那一列放到off-page,直到数据页能寄存下两行。TEXT/BLOB列 <=40 bytes 时总是存放于数据页。可以避免compact那样把太多的大列值放到 B-tree Node,因为dynamic格式认为,只要大列值有部分数据放在off-page,那把整个值放入都放入off-page更有效。

compressed 物理构造上与dynamic相似,但是对表的数据行运用zlib算法进行了紧缩存储。在long blob列类型比拼多的状况下用,可以落低off-page的运用,减少存储空间(50%摆布,可拜见以前“【数据库评测汇报】第三期:innodb、tokudb紧缩机能”汇报中的测试效果),但请求更高的CPU,buffer pool里面可能会同时存储数据的紧缩版和非紧缩版,所以也多占用局部内存。

最后参照 了《高机能MySQL》,给出一些运用BLOB这类变长大字段类型的倡议:

①大字段在InnoDB里可能浪费批量空间。例如,若存储字段值只是比行的请求多了一个字节,也会运用整个页面来存储剩下的字节,浪费了页面的大局部空间。一样的,要是有一个值只是略微超过了32个页的大小,现实上就需要运用96个页面。

②太长的值可能使得在查询中作为WHERE前提不克不及运用索引,因此施行很慢。在利用WHERE前提以前,MySQL需要把所有的列读出来,所以可能致使MySQL请求InnoDB读取许多扩展存储,然后检查WHERE前提,丢弃所有不需要的数据。

③一张表里有许多大字段,最佳组合起来独自存到一个列里面。让所有的大字段同享一个扩展存储空间,比每个字段用本人的页要好。

④把大字段用COMPRESS()紧缩后再存为BLOB,或者在发送到MySQL前在利用程序中进行紧缩,可以获得显著的空间优势和机能收益。

⑤扩展存储禁用了自顺应哈希,由于需要完备的比拼列的整个长度,才干发明是不是准确的数据。

以上就是MySQL数据行溢出的深入了解的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有153人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板