读mysql技术内幕InnoDB 第四章

表:

mysql InnoDB的存储逻辑结构和Oracle大致相同,--表空间:段 segment,区:extent  页:page(块,block)

对于mysql的隐行主键我就不做介绍了,以前说过

InnoDB引擎,在rollback的时候不会去回收表空间,而是将undo信息判断是否需要,不需要就标记为可用空间,下次Undo使用

段:数据段,索引段,回滚段等,

INNODB的引擎对段的管理师有引擎本身完成的,不是每个对象都有段,表空间是有分散的页和段组成的。

区:64个连续的page组成,每个page16K,sql server 8K

对于大的数据InnoDB引擎,每次最多可以申请4个区,来保证数据的顺序性

页:

InnoDB磁盘管理的最小的单位,数据页B-tree Node,Undo页,系统页,事务数据页,插入缓冲位图页,插入缓冲空闲列表页

未压缩的二进制大对象页,压缩的二进制大对象页

行:

InnoDB存储引擎是面向行的,类型有:Compact和Redundant,show table status  like  'test'\G; row_famact 是行的记录 结构类型

Comapact 行记录:

     目标能高效的存放数据,

Null值,除了占用Null的标志位置,不占用任何空间,(varchar,char)

Redundant 行记录格式

为了兼容5.0以前的版本

varchar 的null值不占空间,char的Null值占用空间

char 会占据可能存放的最大值字节数

上边这些的,我不是不关心,只不过是目前我还没遇到过什么问题,我重点要说的是下面的,我曾经遇到过的问题:

----------------------------------------------------------------******************——————————————————————————————————————

行溢出:

我曾经遇到这个问题是在我创建数据表的时候,有多个varchar(7000),我不知道为什么当时我的数据库会提示我把类型转换成text,现在才发现自己太弱了

我只能说虽然varchar的存储是65535,但是他指的是所有varchar列长度的总和,而不是单独一个的,

varchar 溢出的时候,保存在blob中

编码也会影响的,字符占的字节导致的这种情况的产生

GBK,每个字符最多2个字节,UTF8,每个字符最多3个字节

转化varchar-》text

在InnoDB 内部对于多字节字符集类型的存储,char很明确的被视为变长类型,

视图,触发器,我这里不做太多的描叙,因为以前的文章写过

外键:

分区:

mysql 支持的分区类型为水平分区

key分区:根据mysql提供的哈希函数分区

如果表中存在主键或者唯一索引的时候,分区列必须是唯一索引的一个组成部分

hash分区:按照用户自定义的表达式的返回值来进行分区,返回值不能为负数

1 create table test12(
2     id tinyint  not null,
3     count int not null,
4     primary key(count,id),
5     unique key(count)      
6 )engine=innodb 
7 PARTITION BY HASH(count);

我第一次出现了这个错误:

这是因为在创建分区的时候,。数据库要求我们创建分区的字段必须在主键里面

如下:

range分区:行数据基于一个给定的连续区间的列值放入分区



1
create table tests( 2 date datetime 3 )engine=innodb 4 partition by range (YEAR(date))( 5 partition p2008 values less than(2009), 6 partition p2009 values less than(2010), 7 8 );

在使用分区的时候,我们要记得优化自己的sql语句

list分区:list分区面向的是散列的值

1 create table tests(
2    count tinyint 
3 )engine=innodb
4 partition by list(count)(
5  partition p1 values in (2,5,8),
6  partition p2 values in (3,6,9),
7 
8 );

Key分区

1 create table tests(
2    count tinyint 
3 )engine=innodb
4 partition by key(count);

 这四种分区的条件必须是整型,不是整型的也要转换成整型

Hash和Key的区分对于NUll的处理,总是返回0

List分区必须指明那个分区存储NUll

Range分区下Null值会被放入最左边的分区

py_innodb_page_info.py 工具介绍

使用之前,机器上必须安装python,大家有时间看一下

保证你的机器由运行py_innodb_page_info.py的权限

进入文件目录:./py_innodb_page_info.py -v /文件名称

 

原文地址:https://www.cnblogs.com/zhangjun516/p/3028484.html