溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL學(xué)習(xí)筆記(二):MyISAM 存儲(chǔ)引擎

發(fā)布時(shí)間:2020-08-08 07:31:49 來(lái)源:網(wǎng)絡(luò) 閱讀:563 作者:易語(yǔ)隨風(fēng)去 欄目:MySQL數(shù)據(jù)庫(kù)

MyISAM 存儲(chǔ)引擎


MyISAM 基于舊的 (不再可用) ISAM 存儲(chǔ)引擎, 但有許多有用的擴(kuò)展。

每個(gè) MyISAM 表都存儲(chǔ)在三個(gè)文件中的磁盤上。這些文件具有以表名開頭的名稱, 并具有用于指示文件類型的擴(kuò)展名。

.frm文件存儲(chǔ)表定義。

數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。

索引文件的擴(kuò)展名是.MYI (MYIndex)


要明確表示要用一個(gè)MyISAM表格,請(qǐng)用ENGINE表選項(xiàng)指出來(lái):

CREATE TABLE t (i INT) ENGINE = MYISAM;


MySQL 5.7 中, 通常需要使用 ENGINE 來(lái)指定 MyISAM 存儲(chǔ)引擎, 因?yàn)?InnoDB 是默認(rèn)引擎。


可以使用 mysqlcheck 客戶端或 myisamchk 實(shí)用程序檢查或修復(fù) MyISAM 表。還可以使用 myisampack 壓縮 MyISAM 表, 以減少更少的空間。


如下是MyISAM存儲(chǔ)引擎的一些特征:


1. 所有數(shù)據(jù)值首先以低字節(jié)存儲(chǔ)。這使得數(shù)據(jù)機(jī)器和操作系統(tǒng)獨(dú)立。二進(jìn)制可移植性的唯一要求是機(jī)器使用兩個(gè)補(bǔ)間符號(hào)整數(shù)和 IEEE 浮點(diǎn)格式。這些要求廣泛應(yīng)用于在主流機(jī)器中。二進(jìn)制兼容性可能不適用于有特殊的處理器的嵌入式系統(tǒng)。


2. 先存儲(chǔ)數(shù)據(jù)低字節(jié)并不嚴(yán)重地影響速度;數(shù)據(jù)行中的字節(jié)一般是未聯(lián)合的,從一個(gè)方向讀未聯(lián)合的字節(jié)并不比從反向讀更占用更多的資源。服務(wù)器上的獲取列值的代碼與其它代碼相比并不顯得時(shí)間緊。


3. 所有數(shù)字鍵值以高字節(jié)為先被存儲(chǔ)以允許一個(gè)更高地索引壓縮


4. 大文件(達(dá)63位文件長(zhǎng)度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持


5. MyISAM表最大行數(shù)為 18440000000000000000


6. 每個(gè)MyISAM表最大索引數(shù)是64


7. 每個(gè)索引最大的列數(shù)是16個(gè)


8. 最大的鍵長(zhǎng)度是1000字節(jié)。這也可以通過編譯來(lái)改變。對(duì)于鍵長(zhǎng)度超過250字節(jié)的情況,一個(gè)超過1024字節(jié)的的鍵塊被用上。


9. 當(dāng)記錄以排好序的順序插入(就像你使用一個(gè)AUTO_INCREMENT列之時(shí)),索引樹被劈開以便高節(jié)點(diǎn)僅包含一個(gè)鍵。這改善了索引樹的空間利用率。



10. 支持每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理。MyISAM為INSERT和UPDATE操作自動(dòng)更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不能再利用。(當(dāng)AUTO_INCREMENT列被定義為多列索引的最后一列,可以出現(xiàn)重使用從序列頂部刪除的值的情況 )。AUTO_INCREMENT值可用ALTER TABLE或myisamch來(lái)重置。


11. 當(dāng)把刪除和更新及插入混合的時(shí)候,動(dòng)態(tài)尺寸的行更少碎片。這要通過合并相鄰被刪除的塊,以及若下一個(gè)塊被刪除,就擴(kuò)展到下一塊來(lái)自動(dòng)完成。



12. MyISAM 支持并發(fā)插入:如果數(shù)據(jù)文件中間的表沒有自由塊了,在其它線程從表讀的同時(shí),你可以INSERT新行到表中。(這被認(rèn)識(shí)為并發(fā)操作 )。自由塊的出現(xiàn)是作為刪除行的結(jié)果,或者是用比當(dāng)前內(nèi)容多的數(shù)據(jù)對(duì)動(dòng)態(tài)長(zhǎng)度行更新的結(jié)果。當(dāng)所有自由塊被用完(填滿),未來(lái)的插入又變成并發(fā)。請(qǐng)參閱8.11.3 節(jié) "并發(fā)插入"。


13. 你可以把數(shù)據(jù)文件和索引文件放在不同目錄,用DATA DIRECTORY和INDEX DIRECTORY選項(xiàng)CREATE TABLE以獲得更高的速度,請(qǐng)參閱13.3.18節(jié),“CREATE TABLE語(yǔ)法”。



14. BLOB和TEXT列可以被索引。


15. NULL值被允許在索引的列中。這個(gè)占每個(gè)鍵的0-1個(gè)字節(jié)


16. 每個(gè)字符列可以又不同的字符集,請(qǐng)參閱第10.1章 :“字符集支持”。


17. 在MyISAM索引文件里又一個(gè)標(biāo)志,它表明表是否被正確關(guān)閉。如果用--myisam-recover選項(xiàng)啟動(dòng)mysqld,MyISAM表在打開得時(shí)候被自動(dòng)檢查,如果被表被不恰當(dāng)?shù)仃P(guān)閉,就修復(fù)表。


18. 如果你用--update-state選項(xiàng)運(yùn)行myisamchk,它標(biāo)注表為已檢查。myisamchk --fast只檢查那些沒有這個(gè)標(biāo)志的表。


19. myisamchk --analyze為部分鍵存儲(chǔ)統(tǒng)計(jì)信息,也為整個(gè)鍵存儲(chǔ)統(tǒng)計(jì)信息。


20. myisampack可以打包BLOB和VARCHAR列



MyISAM也支持下列特征:


1. 支持true VARCHAR類型;VARCHAR列以存儲(chǔ)在2個(gè)字節(jié)中的長(zhǎng)度來(lái)開始。


2. 有VARCHAR的表可以有固定或動(dòng)態(tài)記錄長(zhǎng)度。


3. VARCHAR和CHAR列可以多達(dá)64KB。


4. 一個(gè)被搞亂的已計(jì)算索引對(duì)可對(duì)UNIQUE來(lái)使用。這允許你在表內(nèi)任何列的合并上有UNIQUE。(盡管如此,你不能在一個(gè)UNIQUE已計(jì)算索引上搜索)。






MyISAM 啟動(dòng)選項(xiàng):


mysqld 的以下選項(xiàng)可用于更改 MyISAM 表的行為。有關(guān)其他信息, 請(qǐng)參見5.1.4 節(jié) "服務(wù)器命令選項(xiàng)"。


1. --myisam-recover-options=mode

設(shè)置為崩潰MyISAM表自動(dòng)恢復(fù)的模式


2. --delay-key-write=ALL

對(duì)任何MyISAM表的寫操作之間不要刷新鍵緩沖區(qū)。

注釋:如果要這么做。當(dāng)MyISAM表在使用中之時(shí),不應(yīng)該使用另一個(gè)程序來(lái)訪問它(比如從另一個(gè)MySQL服務(wù)器或用myisamchk)。這么做會(huì)導(dǎo)致索引被破壞。對(duì)使用--delay-key-write的表,--external-locking不會(huì)生效


以下系統(tǒng)變量會(huì)影響 MyISAM 表的行為。有關(guān)其他信息, 請(qǐng)參見5.1.5 節(jié) "服務(wù)器系統(tǒng)變量"。


1. bulk_insert_buffer_size

用在塊插入優(yōu)化中的樹緩沖區(qū)的大小。注釋:這是一個(gè)per thread的限制。


2. myisam_max_sort_file_size

在重新創(chuàng)建 MyISAM 索引 (在修復(fù)表、更改表或加載數(shù)據(jù) INFILE 期間) 允許 MySQL 使用的臨時(shí)文件的最大大小。如果文件大小大于此值, 則使用密鑰緩存來(lái)創(chuàng)建索引, 這會(huì)比較慢。該值以字節(jié)為單位給出。


3. myisam_sort_buffer_size

設(shè)置恢復(fù)表時(shí)使用的緩沖區(qū)大小。



如果用--myisam-recover選項(xiàng)啟動(dòng)mysqld,自動(dòng)恢復(fù)被激活。在這種情況下,當(dāng)服務(wù)器打開一個(gè)MyISAM表之時(shí),服務(wù)器會(huì)檢查是否表被標(biāo)注為崩潰,或者表的打開計(jì)數(shù)變量是否不為0且你正用--skip-external-locking運(yùn)行服務(wù)器。如果這些條件的任何一個(gè)為真,下列情況發(fā)生:


1. 表被查錯(cuò)。


2. 如果服務(wù)器發(fā)現(xiàn)一個(gè)錯(cuò)誤,它試著做快速表修復(fù)(排序且不重新創(chuàng)建數(shù)據(jù)文件)。


3. 如果修復(fù)因?yàn)閿?shù)據(jù)文件中的一個(gè)錯(cuò)誤而失?。ɡ?,一個(gè)重復(fù)鍵錯(cuò)誤),服務(wù)器會(huì)再次嘗試修復(fù),這一次重建數(shù)據(jù)文件。


4. 如果修復(fù)仍然失敗,服務(wù)器用舊修復(fù)選項(xiàng)方法再重試一次修復(fù)(一行接一行地寫,不排序)。這個(gè)方法應(yīng)該能修復(fù)任何類型的錯(cuò)誤,并且需要很低的磁盤空間。


如果恢復(fù)不能夠從先前完成的語(yǔ)句里恢復(fù)所有行,而且你不能在--myisam-recover選項(xiàng)值指定FORCE,自動(dòng)修復(fù)會(huì)終止,并在錯(cuò)誤日志里寫一條錯(cuò)誤信息:

Error: Couldn't repair table: test.g00pages


如果你指定FORCE,取而代之地,類似這樣的一個(gè)警告被給出:

Warning: Found 344 of 354 rows when repairing ./test/g00pages


注釋:如果自動(dòng)恢復(fù)值包括BACKUP,恢復(fù)進(jìn)程創(chuàng)建文件并用tbl_name-datetime.BAK形式取名。你應(yīng)該有一個(gè)cron腳本,它自動(dòng)把這些文件從數(shù)據(jù)庫(kù)目錄移到備份媒質(zhì)上。




鍵所需的空間


1. MyISAM表使用B型樹索引。你可以粗略地計(jì)算索引文件的大小為(key_length+4)/0.67, 加上所有的鍵之和。當(dāng)所有鍵以排序的順序插入并且表沒有任何壓縮的鍵之時(shí),以上估計(jì)是對(duì)最壞的情況的。


2. 字符串索引是被空間壓縮的。如果第一個(gè)字符串索引部分是字符串,它也被加前綴壓縮。如果字符串列有許多拖曳空間,或字符串 列是一個(gè)總是不用完全長(zhǎng)度的VARCHAR列,空間壓縮使得索引文件比最壞情況時(shí)的數(shù)值要小。前綴壓縮被用在以字符串開始的鍵上。如果有許多具有同一前綴的字符串,前綴壓縮是有幫助的。


3. 在MyISAM表,你也可以在創(chuàng)建表的時(shí)候通過指定PACK_KEYS=1來(lái)前綴壓縮數(shù)字。當(dāng)數(shù)字被以高字節(jié)優(yōu)先存儲(chǔ)之時(shí),若你有許多具有同一前綴的整數(shù)鍵,上述方法是有幫助的。





MyISAM表的存儲(chǔ)格式

MyISAM 支持三種不同的存儲(chǔ)格式。根據(jù)所使用的列類型, 將自動(dòng)選擇其中的兩個(gè), 即固定和動(dòng)態(tài)格式。第三個(gè)壓縮格式只能使用 myisampack 實(shí)用程序創(chuàng)建 (請(qǐng)參見4.6.5 節(jié) "myisampack 生成壓縮的只讀 MyISAM 表")。


當(dāng)你CREATE或ALTER一個(gè)沒有BLOB或TEXT列的表,你可以用ROW_FORMAT表選項(xiàng)強(qiáng)制表的格式為FIXED或DYNAMIC。這 會(huì)導(dǎo)致CHAR和VARCHAR列因FIXED格式變成CHAR,或因DYNAMIC格式變成VARCHAR。


有關(guān) ROW_FORMAT 的信息, 請(qǐng)參見13.1.18 節(jié) "創(chuàng)建表語(yǔ)法"。


您可以使用 myisamchk --unpack 解壓 (unpack) 壓縮的 MyISAM 表,“myisamchk — MyISAM Table-Maintenance Utility”的詳細(xì)信息見4.6.3章節(jié)



靜態(tài)(固定長(zhǎng)度)表特征


1. 靜態(tài)格式是MyISAM表的默認(rèn)存儲(chǔ)格式。當(dāng)表不包含變量長(zhǎng)度列(VARCHAR, BLOB, 或TEXT)時(shí),使用這個(gè)格式。每一行用固定字節(jié)數(shù)存儲(chǔ)。


2. 在三 MyISAM 存儲(chǔ)格式中, 靜態(tài)格式是最簡(jiǎn)單、最安全的 (最不受損壞的)。由于可以輕松地在磁盤上找到數(shù)據(jù)文件中的行, 因此它也是最快的on-disk格式: 當(dāng)按照索引中的行號(hào)查找一個(gè)行時(shí),用行長(zhǎng)度乘以行號(hào)。同樣,當(dāng)掃描一個(gè)表的時(shí)候,很容易用每個(gè)磁盤讀操作讀一定數(shù)量的記錄。


3. 如果您的計(jì)算機(jī)在 MySQL 服務(wù)器寫入固定格式的 MyISAM 文件時(shí)崩潰, 安全是顯然的。在這種情況下, myisamchk 可以很容易地確定每行的開始和結(jié)束位置, 因此它通??梢曰厥粘瞬糠謱懭胫獾乃行?緩沖區(qū)中未寫入的所有行)。MyISAM 表索引始終可以基于數(shù)據(jù)行進(jìn)行重建。


注意:固定長(zhǎng)度行格式僅適用于沒有 BLOB 或TEXT列的表。使用顯式 ROW_FORMAT 子句創(chuàng)建具有BLOB 或TEXT這些列的表不會(huì)引發(fā)錯(cuò)誤或警告; 格式規(guī)范將被忽略。



靜態(tài)格式表的一般特征:


1. CHAR 和 VARCHAR 列的空間填充到指定的列寬,盡管列類型未被更改。BINARY和 VARBINARY 列用0x00 字節(jié)填充到列寬。


2. NULL 列需要行中的額外空間來(lái)記錄它們的值是否為 NULL。每個(gè) NULL 列需要一個(gè)額外的位, 四舍五入到最近的字節(jié)。


3. 非???。


4. 容易緩存。


5. 在崩潰后易于重建, 因?yàn)閿?shù)據(jù)行位于固定位置。


6. 除非刪除大量的行并希望將可用磁盤空間返回給操作系統(tǒng), 否則無(wú)需進(jìn)行重組。為此, 請(qǐng)使用 OPTIMIZE TABLE 或 myisamchk -r。


7. 通常比動(dòng)態(tài)格式表需要更多的磁盤空間。


8. 使用以下表達(dá)式計(jì)算靜態(tài)大小行的預(yù)期行長(zhǎng)度 (以字節(jié)為單位):

row length = 1

+ (sum of column lengths)

+ (number of NULL columns + delete_flag + 7)/8

+ (number of variable-length columns)

對(duì)于具有靜態(tài)行格式的表, delete_flag 為1。靜態(tài)表在行記錄中使用位, 用于指示是否已刪除行的標(biāo)志。delete_flag 是0用于動(dòng)態(tài)表, 因?yàn)樵摌?biāo)志存儲(chǔ)在動(dòng)態(tài)行標(biāo)題中。




動(dòng)態(tài)表特性


如果一個(gè)MyISAM表包含任何可變長(zhǎng)度 列(VARCHAR, BLOB或TEXTDynamic),或者如果一個(gè)表被用ROW_FORMAT=DYNAMIC選項(xiàng)來(lái)創(chuàng)建,動(dòng)態(tài)存儲(chǔ)格式被使用。


動(dòng)態(tài)格式比靜態(tài)格式稍微復(fù)雜一些,因?yàn)槊啃杏幸粋€(gè)表明行有多長(zhǎng)的頭。當(dāng)一個(gè)記錄因?yàn)楦碌慕Y(jié)果被變得更長(zhǎng),該記錄也可以在超過一個(gè)位置處結(jié)束。


可以使用OPTIMIZE TABLE或myisamchk -r來(lái)對(duì)一個(gè)表整理碎片。如果在一個(gè)表中有頻繁訪問或改變的固定長(zhǎng)度列,并且表中也有一些可變長(zhǎng)度列,為避免碎片而把這些可變長(zhǎng)度列移到其它表可能是一個(gè)好主意。



動(dòng)態(tài)格式表的一般特征:


1. 除了長(zhǎng)度少于4的列外,所有的字符串列是動(dòng)態(tài)的。


2. 每行前面都有一個(gè)位圖, 指示哪些列包含空字符串 (對(duì)于字符串列) 或0 (對(duì)于數(shù)值列)。這不包括包含 NULL 值的列。如果字符串列在尾隨空格后的長(zhǎng)度為0, 或者數(shù)值列的值為0, 則在位圖中標(biāo)記, 而不保存到磁盤。非空字符串保存為一個(gè)長(zhǎng)度字節(jié)加上字符串內(nèi)容。


3. NULL 列需要行中的額外空間來(lái)記錄它們的值是否為 NULL。每個(gè) NULL 列需要一個(gè)額外的位, 四舍五入到最近的字節(jié)。


4. 通常比固定長(zhǎng)度表需要更少的磁盤空間


5. 每行只使用所需的空間。但是, 如果行變得更大, 則會(huì)將其拆分為所需的多個(gè)片斷, 從而導(dǎo)致行碎片。例如, 如果使用擴(kuò)展行長(zhǎng)度的信息更新行, 則該行將變得有碎片。在這種情況下, 您可能需要時(shí)不時(shí)運(yùn)行OPTIMIZE TABLE或myisamchk -r以提高性能。使用 myisamchk -ei 獲取表統(tǒng)計(jì)信息。


6. 比靜態(tài)格式表在崩潰后重建更困難, 因?yàn)樾锌赡軙?huì)被分割成許多片段和鏈接 (碎片), 可能會(huì)在重建時(shí)丟失。


7. 使用以下表達(dá)式計(jì)算動(dòng)態(tài)大小行的預(yù)期行長(zhǎng)度:


row length = 3

+ (number of columns + 7) / 8

+ (number of char columns)

+ (packed size of numeric columns)

+ (length of strings)

+ (number of NULL columns + 7) / 8


8. 對(duì)每個(gè)鏈接需要額外的6字節(jié)。在一個(gè)更新導(dǎo)致一個(gè)記錄的擴(kuò)大之時(shí),一個(gè)動(dòng)態(tài)記錄被鏈接了。每個(gè)新鏈接至少是20字節(jié),所以下一個(gè)擴(kuò)大可能在同樣的鏈接里進(jìn)行。如果不是,則另一個(gè)鏈接將被建立。你可以使用myisamchk -ed來(lái)找出鏈接的數(shù)目。所有的鏈接可以用 OPTIMIZE TABLE 或 myisamchk -r來(lái)移除。



壓縮表特性


已壓縮存儲(chǔ)格式是由myisampack工具創(chuàng)建的只讀格式。

已壓縮表可以用myisamchk來(lái)解壓縮。



壓縮表有下列特征:


1. 已壓縮表占據(jù)非常小的磁盤空間。這最小化了磁盤用量,當(dāng)使用緩慢的磁盤(如CD-ROM)之時(shí),這是很有用的。


2. 每個(gè)記錄是被單獨(dú)壓縮的,所以只有非常小的訪問開支。依據(jù)表中最大的記錄,一個(gè)記錄的頭在每個(gè)表中占據(jù)1到3個(gè)字節(jié)。每個(gè) 列被不同地壓縮。通常每個(gè)列有一個(gè)不同的Huffman樹。一些壓縮類型如下:

 2.1 后綴空間壓縮。

 2.2 前綴空間壓縮。

 2.3 零值的數(shù)用一個(gè)位來(lái)存儲(chǔ)。

 2.4 如果在一個(gè)整型列中的值有一個(gè)小的范圍,列被用最小可能的類型來(lái)存儲(chǔ)。比如,一個(gè)BIGINT列(8字節(jié)),如果所有它的值在-128到127范圍內(nèi),它可以被存儲(chǔ)為TINYINT列(1字節(jié))

 2.5 如果一個(gè)列僅有一小組可能的值,列的類型被轉(zhuǎn)化成ENUM。

 2.6 一個(gè)列可以使用先前壓縮類型的任意合并。


3. 可以處理固定長(zhǎng)度或動(dòng)態(tài)長(zhǎng)度記錄。


注意

雖然壓縮表是只讀的, 因此不能在表中更新或添加行, 但 DDL (數(shù)據(jù)定義語(yǔ)言) 操作仍然有效。例如, 您仍然可以使用 drop 除去表, 并截?cái)啾硪郧蹇毡怼?/p>




MyISAM 表問題


MySQL用來(lái)存儲(chǔ)數(shù)據(jù)的文件格式已經(jīng)被廣泛測(cè)試過,但總是有導(dǎo)致數(shù)據(jù)表變得損壞的環(huán)境。


損壞的MyISAM表


即使MyISAM表格式非??煽浚⊿QL語(yǔ)句對(duì)表做的所有改變?cè)谡Z(yǔ)句返回之前被寫下),如果下列任何事件發(fā)生,你依然可以獲得損壞的表:


1. mysqld 進(jìn)程在寫入過程中被殺死。


2. 發(fā)生意外的計(jì)算機(jī)關(guān)機(jī) (例如, 計(jì)算機(jī)被關(guān)閉)。


3. 硬件故障。


4. 使用外部程序 (如 myisamchk) 修改正在被服務(wù)器修改的表。


5. MySQL 或 MyISAM 代碼中的bug。


表?yè)p壞的典型癥狀為:


1. 從表中查詢數(shù)據(jù)時(shí)會(huì)出現(xiàn)以下錯(cuò)誤:

Incorrect key file for table: '...'. Try to repair it


2. 查詢?cè)诒碇姓也坏叫谢蚍祷夭煌暾慕Y(jié)果。


可以使用 CHECK TABLE語(yǔ)句檢查 MyISAM 表的健康狀況, 并用REPAIR TABLE修復(fù)損壞的 MyISAM 表。當(dāng) mysqld 未運(yùn)行時(shí), 還可以使用 myisamchk 命令檢查或修復(fù)表。


參閱 13.7.2.2 章節(jié) “CHECK TABLE Syntax”, 13.7.2.5 章節(jié) “REPAIR TABLE Syntax”, 4.6.3 章節(jié), “myisamchk — MyISAM Table-Maintenance Utility”.



如果表頻繁損壞, 則應(yīng)嘗試確定發(fā)生此事件的原因。最重要的是要知道該表是否因服務(wù)器崩潰而損壞。通過在錯(cuò)誤日志中查找最近 restarted mysqld 消息, 進(jìn)行驗(yàn)證。如果有這樣的消息, 表?yè)p壞很可能是服務(wù)器崩潰導(dǎo)致的。否則, 損壞可能發(fā)生在正常操作期間。這是個(gè) bug。您應(yīng)該嘗試創(chuàng)建一個(gè)可重現(xiàn)的測(cè)試用例來(lái)演示問題。


參閱 B.5.3.3 章節(jié) “What to Do If MySQL Keeps Crashing”, 28.5 章節(jié) “Debugging and Porting MySQL”.




未正確關(guān)閉表的問題


每個(gè) MyISAM 索引文件 (.MYI文件) 在頭部有一個(gè)計(jì)數(shù)器, 可用于檢查表是否已正確關(guān)閉。如果從CHECK TABLE或 myisamchk 得到以下警告, 則表示此計(jì)數(shù)器已經(jīng)不同步了:

clients are using or haven't closed the table properly

此警告不一定意味著該表已損壞, 但至少應(yīng)檢查表。



該計(jì)數(shù)器的工作原理如下:


1. 第一次在 MySQL 中更新表時(shí), 索引文件頭部中的計(jì)數(shù)器將遞增。


2. 在未來(lái)的更新中, 計(jì)數(shù)器不會(huì)更改。


3. 當(dāng)表的最后實(shí)例被關(guān)閉(因?yàn)橐粋€(gè)操作FLUSH TABLE或因?yàn)樵诒砭彌_區(qū)中沒有空間)之時(shí),若表已經(jīng)在任何點(diǎn)被更新,則計(jì)數(shù)器減一。


4. 當(dāng)修復(fù)表, 或檢查表時(shí)它被發(fā)現(xiàn)是好的, 計(jì)數(shù)器被重置為零。


5. 為了避免與其它可能檢查表的進(jìn)程進(jìn)行交互的問題,若計(jì)數(shù)器為零,在關(guān)閉時(shí)計(jì)數(shù)器不減一。



換言之, 只有在下列情況下, 計(jì)數(shù)器才會(huì)變得不正確:


1. 復(fù)制 MyISAM 表, 不先 LOCK TABLES 和 FLUSH TABLES


2.  MySQL在一次更新和最后關(guān)閉之間崩潰(注意,表可能依然完好,因?yàn)镸ySQL總是在每個(gè)語(yǔ)句之間為每件事發(fā)出寫操作)


3. 一個(gè)表被mysqld使用的同時(shí),又被myisamchk --recover或myisamchk --update-state修改。


4. 多個(gè) mysqld 服務(wù)器正在使用該表, 一臺(tái)服務(wù)器在其被另一臺(tái)服務(wù)器使用時(shí)在表上執(zhí)行了修復(fù)表或檢查表。在這個(gè)架構(gòu)中, 使用CHECK TABLE是安全的, 盡管可能從其他服務(wù)器得到警告。但是, 應(yīng)避免REPAIR TABLE, 因?yàn)楫?dāng)一個(gè)服務(wù)器用一個(gè)新的數(shù)據(jù)文件替代舊的之時(shí),其他服務(wù)器不知道這一點(diǎn)。


總的來(lái)說,在多服務(wù)器之間共用一個(gè)數(shù)據(jù)目錄是一個(gè)壞主意。

參閱 5.6 章節(jié) “Running Multiple MySQL Instances on One Machine” 獲得更多研討。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI