1. 程式人生 > >mysql介紹(myisam)

mysql介紹(myisam)

mysql引擎

常用的mysql引擎有myisam、innodb。很多人不知道還有 Memery ,Archive,Ndb等

在這裡詳細介紹myisam的特性
下表是MyISAM 的功能
這裡寫圖片描述

每個myisam表都有三個檔案:.frm(儲存表結構) .myd(儲存資料) .myi(儲存索引)
在 MySQL 5.7,預設引擎是innodb,如果要使用myisam,需要指定 engine=myisam。

myisam具有如下特點:

1、所有資料值都以低位元組優先儲存。 這使得資料機和作業系統獨立。 二進位制可移植性的唯一要求是,機器使用二進位制補碼有符號整數和IEEE浮點格式。 這些要求廣泛應用於主流機器。 二進位制相容性可能不適用於嵌入式系統,有時具有特殊的處理器。儲存資料低位元組優先沒有顯著的速度代價; 錶行中的位元組通常是不對齊的,並且按順序讀取未對齊位元組比按相反順序進行更少的處理。 此外,伺服器中提取列值的程式碼與其他程式碼相比不是時間關鍵的。

2、 所有數字鍵值都以高位元組先儲存,以允許更好的索引壓縮。
3、支援大檔案的檔案系統(最多63位檔案長度)。
4、在MyISAM表中有 (2^32)^2(1.844E + 19)行的限制。
5、每個MyISAM表的最大索引數為64。每個索引的列數上限為16。
6、當按照排序順序插入行時(如使用AUTO_INCREMENT列時),索引樹被拆分,以便高節點只包含一個鍵。 這提高了索引樹中的空間利用率。
7、支援每個表一個AUTO_INCREMENT列的內部處理。 MyISAM自動更新此列以進行INSERT和UPDATE操作。 這使AUTO_INCREMENT列更快(至少10%)。 序列頂部的值在刪除後不會重複使用。 (當AUTO_INCREMENT列被定義為多列索引的最後一列時,將重複使用從序列頂部刪除的值。)AUTO_INCREMENT值可以使用ALTER TABLE或myisamchk重置。
8、 當使用更新、刪除和插入混合操作時,動態大小的行的碎片要少得多。 這是通過自動組合相鄰的已刪除塊以及通過擴充套件塊(如果刪除下一個塊)來完成的。
9、 MyISAM支援併發插入:如果表在資料檔案中間沒有可用塊,則可以在其他執行緒從表中讀取的同時,向其中插入新行。 由於刪除行或更新具有比當前內容更多的資料的動態長度行,可能會發生空閒塊。 當所有空閒塊都用盡(填充)時,將來的插入將再次變為並行。
10 、可以將資料檔案和索引檔案放在不同物理裝置上的不同目錄中,以獲得更高的速度,使用DATA DIRECTORY和INDEX DIRECTORY表選項到CREATE TABLE。
11 、 BLOB和TEXT列可以建立索引。
12 、索引列中允許NULL值。 每個鍵需要0到1個位元組。
13 、每個字元列可以有不同的字符集。
14 、在MyISAM索引檔案中有一個標誌,指示表是否正確關閉。 如果mysqld使用–myisam-recover-options選項啟動,則MyISAM表在開啟時會自動檢查,如果表未正確關閉,則會進行修復。
15、 myisamchk –analyze儲存鍵的部分以及整個鍵的統計資訊。
16、 myisampack可以包裝BLOB和VARCHAR列。
17、 支援一個真正的VARCHAR型別; 一個VARCHAR列以一個或兩個位元組儲存的長度開始。
18、 具有VARCHAR列的表可以具有固定或動態行長度。
19、 表中VARCHAR和CHAR列的長度總和可能高達64KB。
20、 任意長度UNIQUE約束。

MyISAM表儲存格式

MyISAM支援三種不同的儲存格式。 其中兩個,固定和動態格式,根據您使用的列的型別自動選擇。 第三種壓縮格式只能使用myisampack實用程式建立
對沒有BLOB或TEXT列的表使用CREATE TABLE或ALTER TABLE時,可以使用ROW_FORMAT表選項將表格格式強制為FIXED或DYNAMIC。

靜態(固定長度)表特性
1 靜態格式是MyISAM表的預設值。 當表不包含可變長度列(VARCHAR,VARBINARY,BLOB或TEXT)時使用。 每行使用固定數量的位元組儲存。
2 在三種MyISAM儲存格式中,靜態格式是最簡單和最安全的(最少受到損壞)。 它也是最快的磁碟格式,因為可以輕鬆地在磁碟上找到資料檔案中的行:要根據索引中的行號查詢行,請將行號乘以行長 以計算行位置。 此外,當掃描表時,在每次磁碟讀取操作時很容易讀取恆定數量的行。
3 固定長度行格式僅適用於沒有BLOB或TEXT列的表。 使用帶有顯式ROW_FORMAT子句的這些列建立表不會引發錯誤或警告; 格式規範將被忽略。
4 CHAR和VARCHAR列以空格填充到指定的列寬,儘管列型別不更改。 BINARY和VARBINARY列用0x00位元組填充到列寬。
5 NULL列在行中需要額外的空間來記錄它們的值是否為NULL。 每個NULL列需要一個額外的位,向上舍入到最接近的位元組。
6 很快。
7 容易快取。
8 易於在崩潰後重建,因為行位於固定位置。
9 重組是不必要的,除非您刪除了大量的行,並希望將可用磁碟空間返回到作業系統。 為此,請使用OPTIMIZE TABLE或myisamchk -r。
10 通常需要比動態格式表更多的磁碟空間。
動態表特性
1 如果MyISAM表包含任何可變長度列(VARCHAR,VARBINARY,BLOB或TEXT),或者表是使用ROW_FORMAT = DYNAMIC表選項建立的,則使用動態儲存格式。
2 動態格式比靜態格式複雜一點,因為每一行都有一個標題,表示它有多長。 當由於更新而變長時,行可能變得碎片化(以不連續的片段儲存)。
3 可以使用OPTIMIZE TABLE或myisamchk -r對錶進行碎片整理。 如果具有在包含一些可變長度列的表中訪問或更改的固定長度的列,最好將可變長度列移動到其他表,以避免碎片。
4 所有字串列都是動態的,除非長度小於4。
5 每行前面都有一個位圖,指示哪些列包含空字串(對於字串列)或零(對於數字列)。 這不包括包含NULL值的列。 如果字串列在刪除尾部空格後的長度為零,或者數值列的值為零,則會在點陣圖中標記,而不會儲存到磁碟。 非空字串儲存為長度位元組加上字串內容。
6 NULL列在行中需要額外的空間來記錄它們的值是否為NULL。 每個NULL列需要一個額外的位,向上舍入到最接近的位元組。
7 通常比固定長度表需要更少的磁碟空間。
8 每行僅使用所需的空間。 但是,如果行變大,則會將其拆分為所需的數量,從而導致行碎片。 例如,如果使用擴充套件行長度的資訊更新行,則行會變成碎片。 在這種情況下,您可能需要不時執行OPTIMIZE TABLE或myisamchk -r以提高效能。 使用myisamchk -ei獲取表統計資訊。
9 比靜態格式表更難以在崩潰後重建,因為行可能被分段成許多塊,連結(片段)可能會丟失。

MyISAM表問題

MySQL用於儲存資料的檔案格式已經過廣泛測試,但總是存在可能導致資料庫表損壞的情況。 以下討論描述了這種情況如何發生以及如何處理它。
出現損壞表的原因:
1 mysqld程序在寫入的中間被殺死。
2 生意外的計算機關機(例如,計算機關閉)。
3 硬體故障。
4 您正在使用外部程式(例如myisamchk)來修改伺服器正在同時修改的表。
5 MySQL或MyISAM程式碼中的一個bug錯誤。
損壞表的典型症狀如下:
1 從表中選擇資料時出現以下錯誤
Incorrect key file for table: '...'. Try to repair it
>
2 表沒有正確關閉的問題
每個MyISAM索引檔案(.MYI檔案)在標題中都有一個計數器,可用於檢查表是否已正確關閉。 如果從CHECK TABLE或myisamchk獲得以下警告,則表示此計數器已不同步:
clients are using or haven't closed the table properly

此警告不一定意味著表已損壞,但應至少檢查表。
只有在這些條件下,計數器才會變得不正確:
複製MyISAM表,而不首先發出LOCK TABLES和FLUSH TABLES。
MySQL在更新和最後關閉之間崩潰。
表被myisamchk –recover或myisamchk –update-state修改,同時它被mysqld使用。
多個mysqld伺服器正在使用該表,並且一個伺服器在表由另一個伺服器使用時對其執行REPAIR TABLE或CHECK

mysql的配置

MySQL是如何使用記憶體的
MySQL效能模式是一種用於以低級別監視MySQL伺服器執行的功能。 從MySQL 5.7開始,效能模式會逐步動態分配記憶體,將其記憶體使用擴充套件到實際的伺服器負載,而不是在伺服器啟動期間分配所需的記憶體。 一旦分配記憶體,在伺服器重新啟動之前不會釋放記憶體。

對於開啟的每個MyISAM表,索引檔案將開啟一次; 對於每個併發執行的執行緒,資料檔案開啟一次。 對於每個併發執行緒,分配表結構,每個列的列結構和大小為3 * N的緩衝區(其中N是最大行長度,不計算BLOB列)。 BLOB列需要五到八個位元組加上BLOB資料的長度。 MyISAM儲存引擎維護一個額外的行緩衝區供內部使用。

所有執行緒共享相同的基本記憶體。

當不再需要執行緒時,分配給它的記憶體被釋放並返回到系統,除非執行緒返回到執行緒快取記憶體中。 在這種情況下,記憶體保持分配。
myisam_use_mmap系統變數可以設定為1,以便為所有MyISAM表啟用記憶體對映。

所有連線查詢都在單次傳遞中執行,並且大多數連線可以在不使用臨時表的情況下完成。 大多數臨時表是基於記憶體的雜湊表。 具有大行長度(計算為所有列長度的總和)或包含BLOB列的臨時表儲存在磁碟上。

幾乎所有的解析和計算都是線上程本地和可重用的記憶體池中完成的。 小專案不需要記憶體開銷,因此避免了正常的緩慢記憶體分配和釋放。 記憶體只分配給意外的大字串。

對於具有BLOB列的每個表,緩衝器被動態地放大以讀取較大的BLOB值。 如果掃描表,將分配與最大BLOB值一樣大的緩衝區。

MySQL還需要為表定義快取提供記憶體。 table_definition_cache系統變數定義可以儲存在表定義快取記憶體中的表定義(來自.frm檔案)的數量。 如果使用大量表,則可以建立大型表定義快取記憶體以加快表的開啟速度。 表定義快取佔用較少的空間,不使用檔案描述符,與表快取不同。

FLUSH TABLES語句或mysqladmin flush-tables命令會關閉所有未同時使用的表,並在當前正在執行的執行緒完成時將所有正在使用的表標記為關閉。 這有效地釋放了大多數使用中的記憶體。 FLUSH TABLES不會返回,直到所有表都已關閉。

用於管理客戶端連線的每個執行緒都使用一些執行緒特定的空間。 以下列表指示這些和哪些變數控制它們的大小:
key_buffer_size
所有執行緒共享MyISAM金鑰緩衝區; 其大小由key_buffer_size變數確定。 伺服器使用的其他緩衝區根據需要分配。
thread_stack
堆疊

net_buffer_length

連線緩衝區/結果緩衝區(連線緩衝區和結果緩衝區每個以等於net_buffer_length位元組的大小開始,但是根據需要被動態地放大到max_allowed_packet位元組。 每個SQL語句後,結果緩衝區縮減為net_buffer_length個位元組。 當一個語句執行時,還分配當前語句字串的副本。)在MySQL 5.7.4之前,如果效能模式使用語句檢測編譯,則每個會話為1024位元組。 在5.7.4和5.7.5中,每個會話1024位元組。 在5.7.6和更高版本中,每個會話的max_digest_length位元組。
所有執行緒共享相同的基本記憶體。

read_buffer_size

執行表的順序掃描的每個請求都會分配一個讀緩衝區

read_rnd_buffer_size

當以任意序列(例如,排序後)讀取行時,可以分配隨機讀緩衝器( read_rnd_buffer_size)以避免盤尋道。

internal_tmp_disk_storage_engine

如果內部記憶體臨時表變得太大,MySQL會通過將表從記憶體中更改為磁碟格式來自動處理,由internal_tmp_disk_storage_engine定義的儲存引擎處理。 可以增加允許的臨時表大小。大多數執行排序的請求根據結果集大小分配排序緩衝區和0-2個臨時檔案。

table_open_cache

MySQL需要記憶體和表快取的描述符。 所有使用中的表的處理程式結構都儲存在表快取中,並作為“先進先出”(FIFO)管理。 初始表快取大小由table_open_cache系統變數定義

table_definition_cache

MySQL還需要為表定義快取提供記憶體。 table_definition_cache系統變數定義可以儲存在表定義快取記憶體中的表定義(來自.frm檔案)的數量。 如果使用大量表,則可以建立大型表定義快取記憶體以加快表的開啟速度。 表定義快取佔用較少的空間,不使用檔案描述符,與表快取不同。