您好,登錄后才能下訂單哦!
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” 獲得更多研討。
免責(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)容。