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兩種引擎作具體對比介紹。數據庫
在CentOS7上的官方yum庫已經將MySQL換成了MariaDB,要安裝MySQL能夠去MySQL的官網下載安裝,安裝方式有MySQL官方yum源安裝、源碼編譯安裝、通用二進制三種方式。下面以第三種方式(通用二進制)爲例演示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
添加mysql用戶,修改 /usr/local/mysql 目錄的用戶權限,將屬組改成root,屬組改成mysql。併發
~]# useradd mysql -M -s /sbin/nologin
~]# chmown -R root.mysql /usr/local/mysql/*
建立MySQL存放數據的目錄,並修改權限。
~]# mkdir -pv /data/mysql
~]# chown mysql.mysql /data/mysql
使MySQL的各指令使用相對路徑就能使用。
~]# vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH ~]# . /etc/profile.d/mysql.sh #.後面有空格
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
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
~]# chkconfig --add mysqld
~]# service start mysqld
Starting MySQL. SUCCESS!
從上表能夠看出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了,下面再具體介紹兩個主流存儲引擎的區別。
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文件。
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.優秀的自動崩潰恢復特性。
數據存儲:表空間;
併發:MVCC,間隙鎖,行級鎖;
索引:彙集索引、輔助索引;
性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;
備份:支持熱備;
在MySQL較老的版本(5.1之前),MyISAM是默認的存儲引擎。MyISAM存儲引擎不支持事務和行級鎖,而且崩潰後沒法安全恢復。儘管MyISAM有這麼多短板缺點,但不表明他一無可取,對於制度的數據,或者表比較小、可忍受的修復操做,依然可使用MyISAM。MyISAM存儲引擎設計簡單,數據已緊密格式存儲,因此在某些場景下仍是很好用的。但MyISAM最典型的的性能問題仍是表級鎖的問題。MyISAM存儲引擎出經常使用在只讀或讀多寫少、表較小的場景。
MyISAM的特性:
1.支持加鎖與併發訪問控制。MyISAM的鎖是表級別的,就是說MyISAM可對整張表加鎖。讀取時會對須要讀到的全部表家共享鎖,寫入時則對錶加排它鎖。
2.支持修復功能。對於MyISAM表,MySQL能夠手工或者自動執行檢查和修復,但這裏的修復和事務恢復以及崩潰恢復是不一樣的概念。
3.支持全文索引,非彙集索引。
4.表壓縮功能。若是表在建立並導入數據後,不會再進行修改,那麼這樣的表就能使用MyISAM表壓縮功能。這樣能夠減小磁盤空間佔用以及減小磁盤I/O,從而提高查詢性能。
進入MySQL建立存儲引擎爲MyISAM的表:
mysql> CREATE TABLE tbl3(id INT,Name CHAR(30)) Engine 'MyISAM';
在數據庫文件中能夠看到用MyISAM建立的表的結構以下:
tbl_name.frm:表格式定義;
tbl_name.MYD:數據文件;
tbl_name.MYI:索引文件