暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL DBA的自我修养(六)

记忆乘凉 2016-12-21
175

51:详细描述一下rollback 的过程:系统事务表,回滚段,回滚段头,事务槽,事务数据块, 链表。

事务记录的undo有两种,一种是insert undo log,在事务commit和rollback结束后立即被删除,另一种是update undo log,在事务commit和rollback之后被加入到链表中,等待purge线程处理。

无论是哪一种undo,都会记录着undo_no事务的ID,table_id undo对应的表对象,同时也记录了所有的主键和值,在进行rollback时,会根据信息定位到相应的表上。在undo中记录着与事务操作时完全相反的逻辑操作,rollback时会反之进行操作,但回滚之后不一定就是原始数据,因为数据库的并发操作可能会有别的事务进行过操作。回滚的时间要大于等于事务的执行时间。


52:详细描述MySQL 如何实现读已提交数据的过程,活动事务,rollpointer,事务 id。

因为MySQL数据库支持MVCC多版本并发控制,所以innodb存储引擎的事务有读不加锁,读写不互斥的特性,但具体通过MVCC读取哪个版本的数据则由事务的隔离级别控制。

读已提交数据的过程发生在read committed级别,在这个级别下事务会读取被锁定行的最新一份提交的undo数据。因为update undo在事务commit或者rollback之后并不会被立即删除,而是放入链表中,提供MVCC使用,最后等待purge线程处理。

 

53:深刻理解varchar这个数据类型,特别是最大长度 ,M 的含义。

varchar(M) 在MySQL数据库中相比char更加灵活,它是一种可以保存可变长度的字符串的数据类型。跟Oracle的varchar2和SQL server的varchar相比,MySQL可以保存更长的字符串。

M表示长度,长度的意思是指存储的字符串的长度。varchar允许最大存储65535字节,但实际最大是65532,而且根据字符集的不同,其可存储的字符串长度便不同。如使用gbk,那么M不能超过32767,如使用UTF8,那么M不能超过21845。并且,在同一行中,所有varchar类型列的总和也不能超过65535。

 

54:最大行长度的含义,包括不包括 blob。

最大行长度指的就是该行数据加上锁有开销的总长度,如果其中包含着BLOB和LOB列,其所占用的数据及开销也会算在最大行长度中。

但是MySQL数据库的数据页大小为16K ,如果行长度大于这个值就会发生行溢出现象,

数据页中只会记录长列的前768个字节数据及其偏移量,会指向行溢出页,行溢出页就是存储溢出的数据的页,页类型为UncompreeBLOB。

但真正导致行溢出的比较值并不是16K,因为innodb表示IOT表,要保证每个数据页中至少含有两行数据,否则就成了链表失去了索引的意义。经过测试,数据页中允许存储并且不发生行溢出现象的阈值为8098字节。

如果BLOB类型的列存储的值也在8098字节内,它同样不会发生行溢出现象,但是一般选用该类型并不会存储过小的值,多数情况都会发生行溢出。

 

55:问几个问题

1.    假设一个表有 blob 列,那么这个表的行长度最大是多少。

MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。BLOB类型实际是个类型系列(TinyBlob、Blob、MediumBlob、LongBlob),除了在存储的最大信息量上不同外,他们是等同的。 
MySQL的四种BLOB类型 
 TinyBlob  最大 255B
 Blob  最大 65K 
 MediumBlob  最大 16M 
 LongB本身lob  最大 4G 

Blob类型本身会占用10字节大小的数据

2.    假设一个表没有 blob 列,那么这个表的行长度最大是多少。

没有BLOB列的情况下,应该是varchar的长度主导了表的行长度,但依然在数据页上最大为8098,一旦超过这个阈值就会发生行溢出现象,这时在数据页上只会保存钱768字节的数据及其溢出数据的指针。


56:表设计的时候,最基本的原则,简述垂直拆分,做一个垂直拆分的例子,并对垂直拆分的表进行访问。

如果一个表的字段很长,占用的表空间大,这样进行查询操作时会造成大量I/O并使效率下降,就建议对该表进行垂直拆分。将大的字段或者不常用的字段拆分到另一个表中去,该表与原表有着一一对应的关系。

除了 blob 以外,行长度不要超过 16K,而且要要远远的小于 16K,甚至是只有几百个字节,如果一个行的长度确实比较长,我们会对这个表进行垂直拆分,确保一个数据页中存储足够多的数据行。

拆分主要是根据业务的应用类型来看是否适合这种方式,在某些业务耦合度较高的表中就不建议使用这种拆分方式。

拆分的方法相对比较简单,将拆分出来的字段进行数据迁移独立成表,根据表名的不同进行访问就可。


57:行溢出的几种情况,以及应对措施。

  1. 列太多,可以采取垂直拆分;

  2. 存在BLOB等大字段列,可以采取垂直拆分或者将BLOB存储的内容转移到文件系统中,在文件系统中只存储路径;

  3. 修改页的大小,可以修改为32K或者更大;

  4. 可以修改表的存储引擎为MyISAM,它对行长度没有限制;


58:理解checksum各种应用场合以及 mysql 中的应用场合和解决的问题,检测传输过程中是否出现问题(确认软件的完整性)。

checksum在MySQL数据库中应用场合和解决的问题:

  1. 在数据页的File Trailer文件结尾信息中有4字节的checksum信息,用来检验数据的完整性。

  2. 在主从结构中,主的binlog可以记录event和checksum,通过dump线程和IO线程传到从库上时,利用checksum进行检查,来保证主从数据的一致性。

59:MySQL 中有哪几种约束,MySQL 五种约束的作用,语法实现,查询的存在和定义。

1.主键约束(primary)

主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。

MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

列模式:

createtable temp(  id int primary key,   name varchar(25) );  

createtable temp2(  id int not null, namevarchar(25), pwd varchar(15),     constraintpk_temp_id primary key(id) );  

组合模式:

createtable temp2(     id int not null,     name varchar(25),     pwd varchar(15),     constraint pk_temp_id primary key(name,pwd) );

alter删除主键约束

altertable temp drop primary key;  

alter添加主键

altertable temp add primary key(name, pwd);  

alter修改列为主键

altertable temp modify id int primary key;  

设置主键自增

createtable temp(  id int auto_incrementprimary key, name,varchar(20),        

pwdvarchar(16) );

auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。

2.外键约束

外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。

注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录,那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。

创建外键约束:

主表

createtable classes(  id int auto_incrementprimary key, name varchar(20) );

从表

createtable student(id int auto_increment, name varchar(22), constraint pk_id primarykey(id), classes_id int references classes(id) );  

通常先建主表,然后再建从表,这样从表的参照引用的表才存在。

表级别创建外键约束:

createtable student(id int auto_increment primary key, name varchar(25),                        classes_id int, foreignkey(classes_id) references classes(id) );

上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n, 其中student是表名,n是当前约束从1开始的整数。 

指定约束名称:

createtable student(id int auto_increment primary key, name varchar(25), classes_idint, constraint fk_classes_id foreign key(classes_id) references classes(id) );  

多列外键组合,必须用表级别约束语法:

createtable classes(id int, name varchar(20), number int, primary key(name, number) );

createtable student(id int auto_increment primary key, name varchar(20),         classes_name varchar(20), classes_numberint, foreign key(classes_name,classes_number) references classes(name, number) );  

删除外键约束:

altertable student drop foreign key student_ibfk_1;

altertable student drop foreign key fk_student_id;  

增加外键约束:

altertable student add foreign key(classes_name, classes_number) referencesclasses(name, number); 

自引用、自关联(递归表、树状表)

createtable tree(id int auto_increment primary key, name varchar(50),         parent_id int, foreign key(parent_id)references tree(id) );  

级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on delete cascade 或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。

createtable student(id int auto_increment primary key, name varchar(20), classes_namevarchar(20), classes_number int, /*表级别联合外键*/ foreign key(classes_name, classes_number) references classes(name,number) on delete cascade);  

3.非空(notnull)

非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。

Null类型特征: 所有的类型的值都可以是null,包括int、float等数据类型 空字符串””是不等于null,0也不等于null

createtable temp(id int not null, name varchar(255) not null default ‘abc’,         sex char null );

上面的table加上了非空约束,也可以用alter来修改或增加非空约束

增加非空约束

altertable temp modify sex varchar(2) not null;  

取消非空约束

altertable temp modify sex varchar(2) null;  

取消非空约束,增加默认值

altertable temp modify sex varchar(2) default ‘abc’;  

4.唯一键(unique)

唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。 MySQL会给唯一约束的列上默认创建一个唯一索引;

createtable temp (id int not null, name varchar(25), password varchar(16), constraintuk_name_pwd unique(name, password) );

表示用户名和密码组合不能重复

添加唯一约束

altertable temp add unique(name, password);

修改唯一性约束

altertable temp modify name varchar(25) unique;

删除约束

altertable temp drop index name;

5.默认值(default)

DEFAULT约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

CREATETABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstNamevarchar(255),Address varchar(255),City varchar(255) DEFAULT 'Sandnes');

增加默认值:

ALTERTABLE Persons ALTER City SET DEFAULT 'SANDNES';

删除默认值:

ALTERTABLE Persons ALTER City DROP DEFAULT;

 

60:MySQL 五种约束后期添加,风险评估和实践验证。

后期添加约束上面提到过了,这里说一下外键约束的风险。

在MySQL数据库中只有innodb存储引擎支持外键,对于数据库的外键操作,例如插入、更新和删除,都需要立即进行完整性检查,所以会导致浪费时间和资源,有可能会影响性能,特别是海量数据时,每次都需要去检验的话会消耗大量资源,由于还要回主表检查,甚至会发生锁主表的情况发生。所以在性能要求高,数据完整可控的数据库系统中不推荐使用外键。


文章转载自记忆乘凉,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论