99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

MySQL和Oracle在添加字段時(shí)處理上有什么差別?

發(fā)布時(shí)間:2016-11-21 16:14  回復(fù):0  查看:2163   最后回復(fù):2016-11-21 16:14  

數(shù)據(jù)庫(kù)中的表字段想保持一種相對(duì)規(guī)范的順序,怎么辦?要知道Oracle中這個(gè)操作就比較糾結(jié)了,因?yàn)槭前凑兆芳拥姆绞絹?lái)處理的。沒(méi)法在已有的字段1,字段2中間添加一個(gè)字段3。但是MySQL數(shù)據(jù)庫(kù)卻可以,這個(gè)方面MySQL看起來(lái)要靈活的多,這個(gè)是什么原因呢,他們?cè)谠O(shè)計(jì)上有什么差別呢。

MySQL中對(duì)每個(gè)表存在一個(gè)定義文件,即frm文件,我們來(lái)取出一個(gè)表,看看能不能簡(jiǎn)單解析一下。

  比如一個(gè)表字段的內(nèi)容如下:

> desc zd_warshrine_prostate;

+----------+--------------+------+-----+-------------------+----------------+

| Field | Type | Null | Key | Default | Extra |

+----------+--------------+------+-----+-------------------+----------------+

| id | int(10) | NO | PRI | NULL | auto_increment |

| proName | varchar(100) | NO | MUL | NULL | |

| TYPE | varchar(10) | NO | | NULL | |

| loaderr | int(11) | NO | | 0 | |

| loadTime | timestamp | NO | | CURRENT_TIMESTAMP | |

+----------+--------------+------+-----+-------------------+----------------+

  我們可以使用strings來(lái)簡(jiǎn)單解析一下,可以通過(guò)上面的內(nèi)容能夠讀到一些信息。

# strings zd_warshrine_prostate.frm

PRIMARY

in_ty_zyl_proName

InnoDB

)

proName

TYPE

loaderr

loadTime

proName

TYPE

loaderr

loadTime

  大體能夠看出,只解析出來(lái)了字段名。而查看MySQL中的數(shù)據(jù)字典columns,卻壓根看不到column_id這樣的字段。

MySQL和Oracle在添加字段時(shí)處理上有什么差別?

MySQL要實(shí)現(xiàn)添加字段的順序性,語(yǔ)句可以這樣寫:

ALTER TABLE test

ADD COLUMN `amount_sum` double(255,0) AFTER `amount_name`;

  即在字段amount_name后添加字段amount_sum

  難道是MySQL中的這種方式技高一籌,也不是了,對(duì)于添加字段,修改數(shù)據(jù)類型這類的操作,MySQL在早期版本也是飽受詬病,因?yàn)闀?huì)直接鎖表,而且實(shí)現(xiàn)起來(lái)的思路其實(shí)就是復(fù)制表數(shù)據(jù),類似于重建。這個(gè)情況在后來(lái)的一些版本比如5.6有了一些改善,有了pt-osc的工具,這個(gè)改進(jìn)可以在線修改了。而實(shí)現(xiàn)方式其實(shí)有點(diǎn)類似于Oracle中的在線重定義,MySQL中會(huì)創(chuàng)建一個(gè)臨時(shí)表,然后創(chuàng)建2個(gè)觸發(fā)器,然后同步數(shù)據(jù)到臨時(shí)表,然后觸發(fā)器同步操作。如果表數(shù)據(jù)不大,倒還不是什么大問(wèn)題,一旦數(shù)據(jù)量級(jí)上來(lái)了,業(yè)務(wù)關(guān)注度上來(lái)了,這個(gè)地方就值得好好挖掘挖掘。

Oracle中是怎么做的呢??雌饋?lái)還是有不小的差別。

  比如我們查看一個(gè)表users的數(shù)據(jù)。

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) as file#,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) as block#,dbms_rowid.ROWID_ROW_NUMBER(rowid) as row#,a.* from test.USERS a where rownum<2;

FILE# BLOCK# ROW# USERID USER_NAME

---------- ---------- ---------- ---------- --------------------

24 1569619 0 1278 user1278

  通過(guò)上面的輸出可以看到是在24號(hào)文件,數(shù)據(jù)塊1569619中,數(shù)據(jù)信息也一并輸出出來(lái)了,這個(gè)表含有兩個(gè)字段,userid,user_name;

  那么數(shù)據(jù)是如何存儲(chǔ)的呢。我們做一個(gè)dump

alter system dump datafile 24 block 1569619;

  為了圖省事,可以直接查看select *from v$diag_info;得到trace文件的路徑。

/U01/app/oracle/diag/rdbms/mbionline/mbionline/trace/mbionline_ora_15752.trc

  我們輸出幾行trace文件的內(nèi)容,可以看到字段都是存在一個(gè)column_id的字樣,即col 0,col 1這樣的。

tab 0, row 56, @0x134a

tl: 16 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 3] c2 0e 23

col 1: [ 8] 75 73 65 72 31 33 33 34

tab 0, row 57, @0x135a

tl: 16 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 3] c2 0e 24

col 1: [ 8] 75 73 65 72 31 33 33 35

tab 0, row 58, @0x136a

tl: 16 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 3] c2 0e 25

col 1: [ 8] 75 73 65 72 31 33 33 36

Oracle中是按照這個(gè)column_id來(lái)進(jìn)行字段的順序管理的。關(guān)于字段有兩個(gè)很相似的數(shù)據(jù)字典dba_tab_cols,tab_tab_columns。

  里面很重要的一個(gè)屬性就是column_id,同時(shí)也能夠看出還有數(shù)據(jù)類型為Long的字段 DATA_DEFAULT ,這也算是Oracle為此問(wèn)題付出的一個(gè)代價(jià),為了保持兼容性,這個(gè)long類型的字段到了12c依舊是如此。

SQL> desc dba_tab_columns

Name Null? Type

----------------------------------------- -------- ----------------------------

OWNER NOT NULL VARCHAR2(30)

TABLE_NAME NOT NULL VARCHAR2(30)

COLUMN_NAME NOT NULL VARCHAR2(30)

DATA_TYPE VARCHAR2(106)

DATA_TYPE_MOD VARCHAR2(3)

DATA_TYPE_OWNER VARCHAR2(60)

DATA_LENGTH NOT NULL NUMBER

DATA_PRECISION NUMBER

DATA_SCALE NUMBER

NULLABLE VARCHAR2(1)

COLUMN_ID NUMBER

DEFAULT_LENGTH NUMBER

DATA_DEFAULT LONG

NUM_DISTINCT NUMBER

  而如果對(duì)一個(gè)大表添加字段,如果涉及默認(rèn)值,那就工作就很難了,除此之外添加字段方面,Oracle處理起來(lái)還是要好很多,至少不會(huì)重建表數(shù)據(jù)。這也算是兩者在設(shè)計(jì)上的一些差別吧。而對(duì)于Oracle可以有不少的診斷方式,對(duì)于MySQL似乎方式和手段就少了一些,不過(guò)也有幾種方式,

  比如驗(yàn)證MySQL對(duì)于添加字段,修改數(shù)據(jù)類型,可以查看show processlist,找到一個(gè)線程會(huì)標(biāo)示copy to tmp table

  而同時(shí)在數(shù)據(jù)目錄下會(huì)創(chuàng)建兩個(gè)臨時(shí)文件,類似下面的形式。

-rw-rw---- 1 mysql mysql 8860 Nov 4 19:15 #sql-2721_17a3a9.frm

-rw-rw---- 1 mysql mysql 549453824 Nov 4 19:16 #sql-2721_17a3a9.ibd

  而更進(jìn)一步想看到更多的內(nèi)容,那就是源代碼了,其實(shí)還好了,已經(jīng)看到有些牛人在解析這部分的內(nèi)容了,不過(guò)我得自己讀一讀,消化一下,才能拿出來(lái)。

 

來(lái)源:Linux公社

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?