Log File物理結(jié)構(gòu)
成都服務(wù)器托管,成都創(chuàng)新互聯(lián)公司提供包括服務(wù)器租用、西信服務(wù)器托管、帶寬租用、云主機、機柜租用、主機租用托管、CDN網(wǎng)站加速、申請域名等業(yè)務(wù)的一體化完整服務(wù)。電話咨詢:18980820575
從 ib_logfile0和 ib_logfile1這兩個文件的物理結(jié)構(gòu)可以看出,在Log Header部分還是有些許差異的, ib_logfile0會多一些額外的信息,主要是checkpoint信息。
并且每個Block的單位是512字節(jié),對應(yīng)到磁盤每個扇區(qū)也是512字節(jié),因此redo log寫磁盤是原子寫,保證能夠?qū)懗晒Γ幌駃ndex page一樣需要double write來保證安全寫入。
我們依次從上到下來看每個Block的結(jié)構(gòu)
Log File Header Block
Log Goup ID,可能會配置多個redo組,每個組對應(yīng)一個id,當(dāng)前都是0,占用4字節(jié)
Start LSN,這個redo log文件開始日志的lsn,占用8字節(jié)
Log File Number,總是為0,占用4字節(jié)
Created By,備份程序所占用的字節(jié)數(shù),占用32字節(jié)
另外在ib_logfile0中會有兩個checkpoint block,分別是 LOG_CHECKPOINT_1/ LOG_CHECKPOINT_2,兩個記錄InnoDB Checkpoint信息的字段,分別從文件頭的第二個和第四個block開始記錄,并且只在每組log的第一個文件中存在,組內(nèi)其他文件雖然沒有checkpoint相關(guān)信息,但是也會預(yù)留相應(yīng)的空間出來。這里為什么有兩個checkpoint的呢?原因是設(shè)計為交替寫入,避免因為介質(zhì)失敗而導(dǎo)致無法找到可用的checkpoint的情況。
Log blocks
請點擊輸入圖片描述
log block結(jié)構(gòu)分為日志頭段、日志記錄、日志尾部
Block Header,占用12字節(jié)
Data部分
Block tailer,占用4字節(jié)
Block Header
這個部分是每個Block的頭部,主要記錄的塊的信息
Block Number,表示這是第幾個block,占用4字節(jié),是通過LSN計算得來的,占用4字節(jié)
Block data len,表示該block中有多少字節(jié)已經(jīng)被使用了,占用2字節(jié)
First Rec offet,表示該block中作為第一個新的mtr開始的偏移量,占用2字節(jié)
Checkpoint number,表示該log block最后被寫入時的檢查點的值,占用4字節(jié)
1.建立用戶信息表
create table userinfo(id int(4) not null primary key, name varchar(20) not null unique key)engine=innodb default charset=utf8;
2.建立好友關(guān)系表
create table friend(uid int(4) not null, foreign key(uid) references
userinfo(id),fid int(4) not null, foreign key(fid) references
userinfo(id),unique key(uid,fid))engine=innodb default charset=utf8;
3.追加測試數(shù)據(jù)(滿足uidfid條件)
insert userinfo values(1111---9999,'namea---namei’);
insert friend values(1111,4444---6666);
insert friend values(5555,6666---9999);
4.查詢好友(5555的好友)
select * from friend where uid=5555 or fid=5555;
+-------+------+
| uid | fid |
+-------+------+
| 1111 | 5555 |
| 5555 | 6666 |
| 5555 | 7777 |
| 5555 | 8888 |
| 5555 | 9999 |
+-------+--------+
5.問題:
5.1.userinfo中的id和name不為null,且不可重復(fù):table設(shè)計可以做到
5.2.friend中的uid和fid均不為null,且都來自于userinfo的id:table設(shè)計可以實現(xiàn)
5.3.(uid,fid)組合不可重復(fù):table設(shè)計可以完成
5.4.好友關(guān)系的表達(dá)時,(1111,5555)和(5555,1111)有冗余,也會出現(xiàn)(1111,1111)這樣的數(shù)據(jù):這個在table設(shè)計實現(xiàn)比較麻煩,需要在程序?qū)用鎸崿F(xiàn),也即增加限制條件uidfid即可
6.結(jié)果:
table設(shè)計達(dá)不到要求,或者較難達(dá)到要求時,可以在程序?qū)用嬗枰詮浹a。
mysql不固定字段使用動態(tài)增加數(shù)據(jù)庫表字段。
mysql不固定字段有四種技術(shù):
1.動態(tài)增加數(shù)據(jù)庫表字段
2.預(yù)留足夠的空白字段,運行時作動態(tài)映射
3.用xml格式保存在單字段里
4.改列為行,用另外一個表存放定制字段
動態(tài)增加字段的方法在實際操作時候幾乎是不可能的(sqlserver太慢,oracle索性不支持)。