mysql 系統性淺聊 myisam 存儲引擎【原創】

》》思惟導圖

》》介紹 

  mysql中的存儲引擎都是以插件的形式存在,目前用的最多存儲引擎就是innodb和myisam。MySQL5.5.5之後(包括5.5.5)默認使用InnoDB存儲引擎,以前的版本基本就是MyISAM的了。如今有不少人都在網上問,innodb做爲存儲引擎以後,myisam引擎是否是要被淘汰了?其實它們二者之間各有優點,暫時還不能說誰替代誰,不存在滴。php

 

》》存儲結構 

  建立一個myisam數據表html

mysql> create table myisam(
    -> id int not null primary key auto_increment,
    -> cs varchar(50) not null comment 'test'
    -> )engine=myisam default charset=utf8;
Query OK, 0 rows affected (0.10 sec)

  查看錶結構(具體的查看和操做,請看上篇MySQL查看和修改表的存儲引擎mysql

mysql> show create table myisam;
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------+
| Table  | Create Table

                 |
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------+
| myisam | CREATE TABLE `myisam` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cs` varchar(50) NOT NULL COMMENT 'test',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------+
1 row in set (0.00 sec)

  再具體看下底層的myisam數據表的文件組成:linux

windows下的表結構:面試

linux下的表結構是同樣的,我就不貼出來了。sql

看到myisam表是由.frm, .MYD, .MYI三個文件組成:windows

.frm 是表結構文件併發

.MYD 是數據文件函數

.MYI 是索引文件優化

》》特性--不支持事務 

  例子以下:

--》上面已經建立了一個myisam表,表結構以下:

mysql> desc myisam;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| cs    | varchar(50) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

--》操做以下:

--》好吧!沒有對比就沒有傷害!下面試下Innodb是否成功:

》》特性--修復表 

  主要兩個SQL操做語句:

  check table YOUR_TABLE_NAME

  repair table YOUR_TABLE_NAME

 實例以下:

注意:這裏的修復表,並非說能夠將以前刪除的數據找回來,切記切記!

 

》》特性--加鎖和併發
   加鎖:對整張表進行加鎖,而不是行。
           併發:在讀數據的時候,全部的表上均可以得到共享鎖(讀鎖),每一個鏈接都不互相干擾。
                在寫數據的時候,得到排他鎖,會把整個表進行加鎖,而其餘的鏈接請求(讀,寫請求)都處於等待中。
   注意:這裏就是爲何MyISAM表不適合作頻繁的讀寫操做的數據表的存儲引擎!
》》特性--列索引以及延遲索引 

  列索引,其實在這裏我並不想寫太多,後面我會專門寫一篇關於如何創建索引,注意事項以及如何優化索引。

  這裏我主要想講的是延遲索引這個參數,挺有意思的,myisam專有物

  延遲更新索引,MYISAM 默認把DELAY_KEY_WRITE開啓, 整個選項是MYISAM引擎獨有的。

  

不少人都知道在創建索引上的表進行寫操做時,插入大量數據的速度會很是慢,不少辦法是先關閉索引,而後插入數據,再打開索引。其實將delay_key_write選項打開,能夠獲得必定程度的插入速度優化。若是你的某個表有不少update操做,這個參數的優點會很好的體現出來。由於這個參數能延遲更新索引到表關閉。再提醒一次:

  注意:DELAY_KEY_WRITE選項是MYISAM存儲引擎的專有的

 

》》特性--表壓縮 

主要使用myisampack命令

因爲這張表是空表,因此在壓縮的時候加了-f,表示強制壓縮。下面看下壓縮後的文件大小:

你們有沒有發現多了一個OLD文件,這是對原來MYI文件的一個備份,以前是0kb,而後再看下新的MYI文件,目前是1.0K,壓縮後的文件沒有變小反而變大了,爲何呢?

這是因爲原文件是個空文件,強制壓縮以後確定會比原文件大的,多了一些亂七八糟的東西在裏面啦。

注意:壓縮後的文件再執行寫操做時會報錯,這是因爲壓縮後的文件會變成只讀狀態!!切記啊。

 

》》基礎限制 

  在版本 < MySQL 5.0 時默認表的大小爲4G,這對於一些大業務的數據來講是不夠的。

  有什麼辦法能夠擴展嗎?有的。

  如存儲大表則要修改MAX_Rows 和 AVG_ROW_LENGTH這兩個選項。可是必定配置了這兩個參數後,表會馬上重寫。

  因此最好的建議就是更新MySQL的版本啦。

  在版本 > MySQL 5.0 時默認表的大小爲256TB,這對於咱們絕大部分的業務來講都是足夠的了。

》》應用場景 

  最後來講下myisam存儲引擎適合使用在哪些應用場景下:

  1.看了上面的特性,其實咱們很容易知道,須要用到事務型的應用都不適合,只能使用在非事務型應用

  2.對於鎖表而不是鎖行的行爲,一樣的myisam不適合用在頻繁操做寫的應用下,這會形成阻塞,最好用在只讀類應用下。

    3.這個就比較特殊了,上面也沒提到過,空間類應用,在MySQL 5.7只前,myisam是惟一支持空間函數的存儲引擎,若是想存儲空間數據例如GPS數據,或者使用空間函數運算的話,只能使用MyISAM存儲引擎。

歡迎留言。O(∩_∩)O哈哈~

相關文章
相關標籤/搜索