一、MySQL存儲引擎介紹
1、什么是存儲引擎
在說存儲引擎前,舉個例子,我們平時下載電影是不是同一個電影有mp4、rmvb、avi等格式,這些不同的格式的同一個電影清晰度、占用磁盤的空間可能會不同,但是它們的內容都是一樣的。
存儲引擎和上述所說的類似,不同的存儲引擎存入到數據中存儲的形式不同,所以導致占用空間、性能等不同,但是給用戶展現的數據都是相同的。
2、存儲引擎架構
MySQL引入插件是存儲引擎架構,允許將不同的存入引擎加載到正在運行的MySQL服務器中。這也就是說MySQL同時支持多種存儲引擎。
MySQL插件式存儲引擎的體系結構
可以看到MySQL中有很多可插拔式的存儲引擎,MyISAM、InnoDB、Archive、Memory等,不過常用的存儲引擎是MyISAM和InnoDB。
二、MyISAM引擎介紹
1、什么是MyISAM引擎
MyISAM引擎是MySQL5.5.5版本以前數據庫的默認引擎,它基於更老的ISAM代碼,但有很多有用的擴展。
每個MyISAM在磁盤上存儲成三個文件。這三個文件第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名為.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。
[root@hadoop-slave1 mysql]# ll total 1016 -rw-rw----. 1 mysql mysql 8820 Aug 7 23:43 columns_priv.frm -rw-rw----. 1 mysql mysql 0 Aug 7 23:43 columns_priv.MYD -rw-rw----. 1 mysql mysql 4096 Aug 7 23:43 columns_priv.MYI -rw-rw----. 1 mysql mysql 9582 Aug 7 23:43 db.frm -rw-rw----. 1 mysql mysql 1320 Aug 16 11:54 db.MYD -rw-rw----. 1 mysql mysql 5120 Aug 16 12:15 db.MYI -rw-rw----. 1 mysql mysql 10223 Aug 7 23:43 event.frm -rw-rw----. 1 mysql mysql 0 Aug 7 23:43 event.MYD -rw-rw----. 1 mysql mysql 2048 Aug 7 23:43 event.MYI ...
MySQL系統表多數都使用了MyISAM引擎。
2、特點
- 不支持事務
- 表級鎖定(更新時鎖定整個表)
- 讀寫互相阻塞(寫入時阻塞讀入、讀時阻塞寫入;但是讀不會互相阻塞)
- 只會緩存索引(通過key_buffer_size緩存索引,但是不會緩存數據)
- 讀取速度快
- 不支持外鍵,但支持全文索引
3、生產業務場景
- 不需要支持事務的場景(像銀行轉賬之類的不可行)
- 一般讀數據的較多的業務
- 數據修改相對較少的業務
- 數據一致性要求不是很高的業務
4、MyISAM引擎調優
- 設置合適索引
- 啟用延遲寫入,盡量一次大批量寫入,而非頻繁寫入
- 盡量順序insert數據,讓數據寫入到尾部,減少阻塞
- 降低並發數,高並發使用排隊機制
- MyISAM的count只有全表掃描比較高效,帶有其它條件都需要進行實際數據訪問
三、InnoDB引擎介紹
InnoDB支持事務(ACID)以及外鍵支持,InnoDB引擎的表在磁盤上保留了一個frm擴展名的文件:
[root@hadoop-slave1 crm_db]# ll ... -rw-rw----. 1 mysql mysql 8622 Aug 30 10:22 userinfo.frm ...
2、特點
- 支持事務,支持4個事務隔離級別
- 行級鎖定(更新時鎖定當前行)
- 讀寫阻塞與事務隔離級別相關
- 既能緩存索引又能緩存數據
- 支持外鍵
- InnoDB更消耗資源,讀取速度沒有MyISAM快
3、生產業務場景
- 需要支持事務的場景(銀行轉賬之類)
- 適合高並發,行級鎖定對高並發有很好的適應能力,但需要確保查詢是通過索引完成的
- 數據修改較頻繁的業務
4、MyISAM引擎調優
- 主鍵盡可能小,否則會給Secondary index帶來負擔
- 避免全表掃描,這會造成表鎖
- 盡可能緩存所有的索引和數據,減少IO操作
- 避免主鍵更新,這會造成大量的數據移動
四、引擎總結
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree indexes | Yes | Yes | Yes | No | No |
Backup/point-in-time recovery (note 1) | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Clustered indexes | No | No | Yes | No | No |
Compressed data | Yes (note 2) | No | Yes | Yes | No |
Data caches | No | N/A | Yes | No | Yes |
Encrypted data | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 3) |
Foreign key support | No | No | Yes | No | Yes (note 5) |
Full-text search indexes | Yes | No | Yes (note 6) | No | No |
Geospatial data type support | Yes | No | Yes | Yes | Yes |
Geospatial indexing support | Yes | No | Yes (note 7) | No | No |
Hash indexes | No | Yes | No (note 8) | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Replication support (note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
Storage limits | 256TB | RAM | 64TB | None | 384EB |
T-tree indexes | No | No | No | No | Yes |
Transactions | No | No | Yes | No | Yes |
Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |
五、引擎相關命令
1、查看MySQL引擎
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | CSV | YES | CSV storage engine | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 8 rows in set (0.00 sec)
2、更改引擎
# 法一 mysql> ALTER TABLE userinfo ENGINE=MyISAM; # 法二 [root@hadoop-slave1 ~]# mysql_convert_table_format --user=root --password=123456 \
--socket=/data/3306/mysql.sock --engine=MyISAM crm userinfo
3、配置項參數
# InnoDB用來存儲數據目錄信息&其它內部數據結構的內存池的大小。你應用程序里的表越多,你需要在這里分配越多的內存。如果InnoDB用光了這個池內的內存,
InnoDB開始從操作系統分配內存,並且往MySQL錯誤日志寫警告信息。默認值是1MB。 innodb_additional_mem_pool_size = 16M # InnoDB用來緩存它的數據和索引的內存緩沖區的大小。你把這個值設得越高,訪問表中數據需要得磁盤I/O越少。在一個專用的數據庫服務器上,
你可以設置這個參數達機器物理內存大小的80%。盡管如此,還是不要把它設置得太大,因為對物理內存的競爭可能在操作系統上導致內存調度。 innodb_buffer_pool_size = 2048M # 到單獨數據文件和它們尺寸的路徑。通過把innodb_data_home_dir連接到這里指定的每個路徑,到每個數據文件的完整目錄路徑可被獲得。 innodb_data_file_path = /ibdata/ibdata1:2000M:autoextend # InnoDB中文件I/O線程的數量。正常地,這個參數是用默認的,默認值是4,但是大數值對Windows磁盤I/O有益。在Unix上,增加這個數沒有效果,InnoDB總是使用默認值。 innodb_file_io_threads = 4 # 當innodb_flush_log_at_trx_commit被 設置為0,日志緩沖每秒一次地被寫到日志文件,並且對日志文件做到磁盤操作的刷新,但是在一個事務提交不做任何操作。
當這個值為1(默認值)之時,在每個事務提交時,日志緩沖被寫到日志文件,對日志文件做到磁盤操作的刷新。當設置為2之時,在每個提交,日志緩沖被寫到文件,
但不對日志文件做到磁盤操作的刷新。 innodb_flush_log_at_trx_commit = 2 #InnoDB事務在被回滾之前可以等待一個鎖定的超時秒數。InnoDB在它自己的鎖定表中自動檢測事務死鎖並且回滾事務。InnoDB用LOCK TABLES語句注意到鎖定設置。默認值是50秒。 innodb_lock_wait_timeout = 120 # InnoDB用來往磁盤上的日志文件寫操作的緩沖區的大小。明智的值是從1MB到8MB。默認的是1MB。一個大的日志緩沖允許大型事務運行而不需要在事務提交之前往磁盤寫日志。
因此,如果你有大型事務,使日志緩沖區更大以節約磁盤I/O。 innodb_log_buffer_size = 16M # 在日志組里每個日志文件的大小。在32位計算機上日志文件的合並大小必須少於4GB。默認是5MB。明智的值從1MB到N分之一緩沖池大小,
其中N是組里日志文件的數目。值越大,在緩沖池越少需要檢查點刷新行為,以節約磁盤I/O。但更大的日志文件也意味這在崩潰時恢復得更慢。 innodb_log_file_size = 128M # 在日志組里日志文件的數目。InnoDB以循環方式寫進文件。默認是2(推薦)。 innodb_log_files_in_group = 3 ...
更多請參考MySQL安裝包中mysql-5.5.32/support-files/my-innodb-heavy-4G.cnf文件。