一、Mysql一次讀取數(shù)據(jù)的最小單位
mysql讀取數(shù)據(jù)的最小單位微row 即行。行內(nèi)可以內(nèi)微字段。select a from tab where id=1; 即讀獲取某一個(gè)id為1的 a字段。如果說mysql的存儲(chǔ)單位是沒有行或者頁的區(qū)別。定義關(guān)鍵字為char(1) 即字符1個(gè)。定義關(guān)鍵字為int(1)即長度為1。定義關(guān)鍵字TINYBLOB二進(jìn)制類型0-255字節(jié)。
在MySQL的設(shè)定中,單行數(shù)據(jù)最大能存儲(chǔ)65535byte的數(shù)據(jù)(注意是byte,而不是字符)。MySQL不允許創(chuàng)建一個(gè)長度為65535byte的列,因?yàn)閿?shù)據(jù)頁中每一行中都有隱藏列,所以將varchar的長度降低到65532byte即可成功創(chuàng)建該表。
注意這里的65535指的是字節(jié),而不是字符。
所以如果你將charset換成utf8這種編碼格式,那varchar(N)中的N其實(shí)指的N個(gè)字符,而不是N個(gè)byte。
假如encode=utf8時(shí)三個(gè)byte表示一個(gè)字符。那么65535 / 3 = 21845個(gè)字符。
延伸閱讀:
二、并發(fā)鎖
在一定條件下,MyISAM也支持查詢和操作的并發(fā)進(jìn)行。
MyISAM存儲(chǔ)引擎有一個(gè)系統(tǒng)變量concurrent_insert,專門用以控制其并發(fā)插入的行為,其值分別可以為0、1或2。
當(dāng)concurrent_insert設(shè)置為0時(shí),不允許并發(fā)插入。
當(dāng)concurrent_insert設(shè)置為1時(shí),如果MyISAM允許在一個(gè)讀表的同時(shí),另一個(gè)進(jìn)程從表尾插入記錄。這也是MySQL的默認(rèn)設(shè)置。
當(dāng)concurrent_insert設(shè)置為2時(shí),無論MyISAM表中有沒有空洞,都允許在表尾插入記錄,都允許在表尾并發(fā)插入記錄。
可以利用MyISAM存儲(chǔ)引擎的并發(fā)插入特性,來解決應(yīng)用中對(duì)同一表查詢和插入鎖爭用。例如,將concurrent_insert系統(tǒng)變量為2,總是允許并發(fā)插入;同時(shí),通過定期在系統(tǒng)空閑時(shí)段執(zhí)行OPTIONMIZE TABLE語句來整理空間碎片,收到因刪除記錄而產(chǎn)生的中間空洞。