》》思惟導圖
》》介紹
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 默認把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哈哈~