MySQL数据存储引擎 & B+树索引

MySQL的存储引擎目前总共有9种ARCHIVEBLACKHOLEMRG_MYISAMFEDERATEDMyISAMPERFORMANCE_SCHEMA、InnoDB、MEMORYCSV,但常用的有两种,一种是InnoDB,一种是MyISAM。可以在MySQL中使用命令行show engines查看MySQL支持的所有存储引擎, 若想要比较好的显示结果可以使用show engines \G命令查看MySQL的数据存储引擎,结果会显示存储引擎名称、特性以及支持的功能。

以下是通过show engines \G命令查看的存储引擎结果:

*************************** 1. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 8. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO

重点来关注常用的两种:InnoDB、MyISAM。

InnoDB

InnoDB作为MySQL的存储结构,其存储文件为

​ $ InnoDB=\begin{cases} *_. frm & 表结构定义文件 \ \ ibdata1 & 表空间存放元数据、Buffer、UNDO日志\end{cases} $

随着创建的数据库越来越多或数据库中创建的数据越来越多,ibdata1文件会越来越大,如何对InnoDB进行瘦身也是经常讨论的问题。

MyISAM

MyISAM的存储文件个数相比较InnoDB而言多了一个,其文件结构为

​ $MyISAM=\begin{cases} _. frm & 表结构定义文件 \ \ .MYD & 数据文件 \ \ *.MYI & 索引文件\end{cases}$

可以发现MyISAM的存储与InnoDB的不同,其将索引作为单独的一个文件,而InnoDB则是索引和数据都存放在表空间中,这也导致了两者内部的索引原理不同。

InnoDB与MyISAM特性比较

InnoDB与MyISAM虽然都是常用的数据存储引擎,在特性上两者有很大不同,下面从以下方面将两者进行对比:

特性 InnoDB MyISAM
事务 支持 不支持
数据锁定 支持 不支持
全文索引 不支持 支持
外键约束 支持 不支持
表空间大小 较大 较小