MySQL中MyISAM和InnoDB兩種主流存儲引擎的特色

1、數據庫引擎(Engines)的概念

  MySQ5.6L的架構圖:mysql

  MySQL的存儲引擎全稱爲(Pluggable Storage Engines)插件式存儲引擎。MySQL的全部邏輯概念,包括SQL Interface、Parser、Optimizer、Caches和Buffers等,都須要真正轉爲物理層的實際數據的,怎麼存或者以什麼方式存的問題就須要存儲引擎來實現。存儲引擎對關係型數據庫來說是一個很是重要的概念。在MySQL中經常使用的文件系統有MyISAM、InnoDB、Federated、Archive、Merge、Memory等等。其中MyISAM和InnoDB最爲廣泛。linux

  簡化的MySQL架構圖(圖片來自《高性能MySQL_第3版》):sql

  下面對MySQL中MyISAM和InnoDB兩種引擎作具體對比介紹。數據庫

2、安裝MySQL

  在CentOS7上的官方yum庫已經將MySQL換成了MariaDB,要安裝MySQL能夠去MySQL的官網下載安裝,安裝方式有MySQL官方yum源安裝、源碼編譯安裝、通用二進制三種方式。下面以第三種方式(通用二進制)爲例演示MySQL的安裝步驟。編程

1.下載通用二進制格式的MySQL程序包並解壓

  官方下載地址是https://dev.mysql.com/downloads/mysql/,目前最新的版本是MySQL8.0.13,但通常用到的是MySQL5系列,這裏用MySQL5.7作示例,包名爲 mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz 。
vim

  通用二進制格式的程序包安裝起來和yum安裝一樣方便快捷,直接解壓再作初始化配置就能直接使用了,而且和系統耦合性低,很方便作數據遷移。緩存

   下載並解壓 mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz 至 /usr/local/ 下安全

~]# tar xf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/

  解壓後建立軟鏈接:架構

~]# cd /usr/local
~]# ln -sv mysql-5.7.18-linux-glibc2.5-x86_64 mysql

2.初始化MySQL

添加mysql用戶,修改 /usr/local/mysql 目錄的用戶權限,將屬組改成root,屬組改成mysql。併發

~]# useradd mysql -M -s /sbin/nologin
~]# chmown -R root.mysql /usr/local/mysql/*

3.建立數據庫目錄

  建立MySQL存放數據的目錄,並修改權限。

~]# mkdir -pv /data/mysql
~]# chown mysql.mysql /data/mysql

4.將MySQL的安裝路徑添加至環境變量中

  使MySQL的各指令使用相對路徑就能使用。

~]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
~]# . /etc/profile.d/mysql.sh #.後面有空格

5.用mysql_install_db部署mysql

  mysql_install_db的官方解釋爲MySQL Database Deployment Utility.(MySQL數據庫部署實施工具),經常使用選項:

~]# mysql_install_db --datadir=/data/mysql --basedir=/usr/local/mysql --insecure --user=mysql

注:在5.7後的版本中在MySQL初始化部署時可採用 mysqld --initialize 命令更快捷的進行初始化, --insecure 表示隨機密碼。例如:

~]# mysqld --initilize-insecure --datadir=/data/mysql --user=mysql --basedir=/usr/local/mysql

6.建立MySQL配置文件my.cnf

  my.cnf文件能夠放在/etc/、/etc/mysql/、/usr/local/mysql/etc/下,這裏建議建立在/usr/local/mysql/etc/下,方便管理。

~]# vim /usr/local/mysql/etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/usr/local/mysql/logs/error.log #需手動建立logs目錄和error.log文件,並修改權限爲mysql.mysql,目錄和文件都須要修改,不然會出錯
pid-file=/var/run/mysql/mysql.pid
!includedir /usr/local/mysql/etc/my.cnf.d

7.添加服務管理並啓動服務

~]# chkconfig --add mysqld
~]# service start mysqld
Starting MySQL. SUCCESS!

 3、MySQL的MyISAM存儲引擎和InnoDB存儲引擎詳解

1.查看MySQL支持的引擎類別與屬性

  從上表能夠看出MySQL5.7支持8種存儲引擎,其中InnoDB是默認的存儲引擎,從Transactions這欄中可得知只有InnoDB支持事務,因此從某些角度講,InnoDB是MySQL中功能最完善的存儲引擎了,目前主流的存儲引擎就是InnoDB和MyISAM。

  在MySQL自帶的庫中,默認存儲引擎爲MyISAM,由於MyISAM一般對讀多寫少的數據庫能發揮很好的性能。另外一點須要強調的是:存儲引擎是表級別的概念。同一DATABASE的不一樣表能夠是不一樣類型的存儲引擎。但這裏強烈建議在同一DATABASE中使用同一存儲引擎。

  查看庫中表的存儲引擎類型可用 SHOW TABLE STATUS 命令,如:

mysql> USE mysql;
mysql> SHOW TABLE STATUS WHERE Engine=InnoDB\G; #過濾名爲mysql庫中的存儲引擎爲InnoDB的表。

  在結果中可看出MySQL已經漸漸的由MyISAM引擎轉向InnoDB了,下面再具體介紹兩個主流存儲引擎的區別。

2.InnoDB介紹

  InnoDB的數據存儲在表空間(table space)中,相較於其餘存儲引擎有所不一樣的是,其餘存儲引擎將數據存儲在具體的文件系統中,如MyISAM的每一個表都有一個屬於本身的文件。但InnoDB的存儲方式是基於黑盒模式的,就是說InnoDB將全部的數據都存儲在一個空間中,任何庫的任何存儲引擎類型爲InnoDB的表數據和索引全都在一個盒子中,這個盒子就稱爲表空間(table space),它內部有本身的文件系統。當表愈來愈多,佔用空間愈來愈大時,會生成lbdata二、lbdata三、依次增長。在MySQL的數據目錄下能夠看到MySQL的默認表空間:

~]# ll -h /data/mysql/
total 121M
-rw-r-----. 1 mysql mysql   56 Oct 24 08:26 auto.cnf
-rw-r-----. 1 mysql mysql  419 Oct 24 08:27 ib_buffer_pool
-rw-r-----. 1 mysql mysql  12M Oct 24 08:38 ibdata1 #這個文件就是默認的表空間文件,任何庫的任何存儲引擎類型爲InnoDB的表都存儲在這一文件中。

  也能夠在MySQL中設置將使用InnoDB引擎的表存儲在本身單獨的表空間(包括數據文件和索引信息)中,存儲路徑在所屬庫的目錄下,而不是在MySQL數據目錄下。代碼爲 innodb_file_per_table=ON 。下面演示說明,設置路徑以下:

~]# vim /usr/local/mysql/etc/my.cnf.d/service.cnf
[mysqld]
innodb_file_per_table=ON

  重啓後在MySQL中查看:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)

  建立一個新表:

mysql> CREATE TABLE tbl2(id INT,Name CHAR(30));

  查看默認庫(mysql庫)中的文件:

  tbl2.ibd就是表tbl2單獨的表空間,tbl2.frm爲表結構文件。若未啓用 innodb_file_per_table=ON 則只有tbl2.frm文件。

 3.InnoDB的特性:

1.InnoDB是一種事務型存儲引擎,適用於對事務要求較高的場景中,但較適用於處理大量的短時間事務(short-lived),若要處理大量長事務,能夠選擇Oracle。

2.InnoDB基於MVCC(Mutli Version Concurrency Control)多版本併發控制,支持高併發。

PS:所謂MVCC是指數據庫管理系統經常使用的併發控制方法,用於提供對數據庫的併發訪問,並以編程語言實現事務內存。若是沒有併發控制,若是用戶A在用戶B寫入數據庫的同時從數據庫中讀取數據,則用戶A可能會看到寫了一半或不完整的數據,也可能沒法查看數據。這裏所描述的多版本實際上是指將原表作多個快照,在不一樣用戶的不一樣訪問時間點進行快照,由於每個鏈接都是基於快照進行的,因此用戶之間的訪問互相不受影響,雖然這樣的方式不能徹底避免用戶A讀到和用戶B修改後的數據,但能大大提升併發性。

3.支持四個隔離級別,默認爲REPEATABLE-READ。

4.支持間隙鎖防止幻讀。

5.支持使用匯集索引,將數據和索引存儲在同一處,找到索引便找到數據,從而提升性能,但每一個表上只能有一個彙集索引

6.支持自適應hash索引。

7.優秀的自動崩潰恢復特性。

4.InnoDB關鍵字

數據存儲:表空間;
併發:MVCC,間隙鎖,行級鎖;
索引:彙集索引、輔助索引;
性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;
備份:支持熱備;

5.MyISAM存儲引擎

  在MySQL較老的版本(5.1之前),MyISAM是默認的存儲引擎。MyISAM存儲引擎不支持事務和行級鎖,而且崩潰後沒法安全恢復。儘管MyISAM有這麼多短板缺點,但不表明他一無可取,對於制度的數據,或者表比較小、可忍受的修復操做,依然可使用MyISAM。MyISAM存儲引擎設計簡單,數據已緊密格式存儲,因此在某些場景下仍是很好用的。但MyISAM最典型的的性能問題仍是表級鎖的問題。MyISAM存儲引擎出經常使用在只讀或讀多寫少、表較小的場景。

  MyISAM的特性:

1.支持加鎖與併發訪問控制。MyISAM的鎖是表級別的,就是說MyISAM可對整張表加鎖。讀取時會對須要讀到的全部表家共享鎖,寫入時則對錶加排它鎖。

2.支持修復功能。對於MyISAM表,MySQL能夠手工或者自動執行檢查和修復,但這裏的修復和事務恢復以及崩潰恢復是不一樣的概念。

3.支持全文索引,非彙集索引。

4.表壓縮功能。若是表在建立並導入數據後,不會再進行修改,那麼這樣的表就能使用MyISAM表壓縮功能。這樣能夠減小磁盤空間佔用以及減小磁盤I/O,從而提高查詢性能。

6.MyISAM表建立示例

  進入MySQL建立存儲引擎爲MyISAM的表:

mysql> CREATE TABLE tbl3(id INT,Name CHAR(30)) Engine 'MyISAM'; 

  在數據庫文件中能夠看到用MyISAM建立的表的結構以下:

tbl_name.frm:表格式定義;
tbl_name.MYD:數據文件;
tbl_name.MYI:索引文件

相關文章
相關標籤/搜索