最近会一直研究mysql,主要参照书籍《MySQL技术内幕:InnoDB存储引擎》,原因是自己的sql能力实在太过于薄弱,甚至于连建表语句都要百度,所以决心花一个月研究mysql,环境是mysql5.5(不支持optimizer_trace)
Innodb要求每张表都必须有主键,如果我们显示定义主键,那么就是用这个,否则它会进行如下两步操作
1:如果有 某一列是 非空唯一索引,该列成为主键,这是书籍中的话,可是笔者就抱着打破砂锅问到底的态度去验证了一番,发现还有一个限制条件,就是该列必须是int(tinyint,smallint,bigint也行)
2:不符合上述条件,生成一个6字节大小的DB_ROW_ID指针作为主键
第一点的验证截图如下
age是 not null, unique key , int
而当age的这三个条件任意一个不满足的情况下
对于第二点这种方式证明不了,_rowid只能查到第一点这种情况
第二种情况的证明如下:
先容许我说明一下innodb_file_per_table
innodb_file_per_table = off 的意思是 ibd的数据文件都统一保存到ibdata1文件中,我的路径是D:\lry\install\mysql\ibdata1
innodb_file_per_table = on 的意思是ibd文件会根据每一个表独立保存,例如我开始该选项后数据保存在C:\ProgramData\MySQL\MySQL Server 5.5\data\lry\t1.ibd(其中ProgramData是隐藏文件夹)
我再啰嗦两句
frm文件是框架文件,表结构之类的信息
ibd文件是innodb引擎的数据及索引数据
myi文件是myisam的索引数据
myd是myisam的数据
由于我是5.5版本,默认不开启,可以用命令查看是否开启show variables like ‘%per_table%’
windows下开启该选项的方式:
进入 C:\Program Files\MySQL\MySQL Server 5.5\my.ini
最后一行添加如下
innodb_file_per_table=1 重启电脑即可,但是要记住,你之前所建立的表不会生成ibd文件,他不会帮你从ibdata1挪到ibd文件,所以要测试这个东西还得重新建表。
到此为止,innodb_file_per_table 就说完了,现在我唯一想做的事情就是打开t1.ibd文件找到DB_ROW_ID,看看是否真的帮我们生成了主键。
我用ultraEdit软件打开t1.ibd文件,和我想象的不一样,然后我又按照书籍的方式去创建mytest表
create table mytest (
t1 varchar(10),
t2 varchar(10),
t3 char(10),
t4 varchar(10)
)engine = Innodb charset =latin1 row_format = compact
insert into mytest values ('a','bb','bb','ccc');
insert into mytest values ('d','ee','ee','fff');
insert into mytest values ('d',NULL,NULL,'fff');
得到如下结果
完全分析不了,用linux 的 hexdump -C -v mytest.ibd > my 生成的文件也很乱,不知道原因,这里就直接分析书籍上的吧
在分析上图之前,我得把compact行格式说清楚,不然没法分析
分析那个绿绿的图
supremum这个是上确界的意思,提示我们从0000c078,即 03(后面是02 01)开始分析
分析第一行数据a,bb,bb(定长10),ccc
03 02 01代表这行数据的变长字段的长度列表(逆序数的,ccc长度3,bb长度2,a长度1)
00 第一行没有null值 (但是像第三行数据,d,null,null,fff ,这个null标志位是06,00000110,就是把null的位置为1)
00 00 10 00 2c 记录头信息
00 00 00 2b 68 00 这个就是row_id了
00 00 00 00 06 05 tran_id
80 00 00 00 32 01 10 roll_pointer
61 就是a
62 62 就是bb
62 62 20 20 20 20 20 20 20 20 就是bb,用空格补全为10
63 63 63 就是ccc
第一行数据就分析完了,另两行也可以分析出来,这里不再赘述
起初我只是想证明innodb确实帮我们生成了row_id,却没想到牵连出这么多东西,真的是才疏学浅了,这篇算是一篇刨根问底的文章了,作为技术人员的巅峰就是要有这样的精神,但我有时候也很懒,我其实一直在犹豫到底要不要写一个mysql专题,有10来天了吧,浑浑噩噩的,总感觉学完了不写一点东西出来,感觉没学一样,所以还是最终感谢自己,克服了懒惰,mysql专题会一直更新,预计耗时一个月,大概7~8篇博文。