MySQL优化02:数据库引擎
MyISAM
和InnoDB
引擎的比较
MySQL的数据库引擎主要有MyISAM
和InnoDB
,对于现在的项目来说,直接上InnoDB
可以满足绝大多数需求,因此InnoDB
也是MySQL5.5版本之后的默认引擎(之前是MyISAM
),但我们还是要了解一下两个引擎之间的区别.
-
InnoDB
支持事务,而MyISAM
不支持(这一条区别足以让我们放弃MyISAM
).若不显式开启事务,InnoDB
会将每一条SQL语句都封装成一个事务进行提交. -
InnoDB
支持行级锁,而MyISAM
只支持表级锁.因此InnoDB
支持并发比MyISAM
高,但有可能产生死锁. -
InnoDB
支持外键,而MyISAM
不支持(当然现在的项目不提倡使用外键,所以这个差异可以忽略). -
InnoDB
是聚集索引,即数据文件和索引是存在同一文件内的,要求必须有主键.而MyISAM
是非聚集索引,数据文件和索引分开存储在两个文件中.MySQL中数据库的数据文件存储格式:
- 对于
MyISAM
引擎:.frm
文件保存表结构,.myd
存储数据,.myi
存储索引 - 对于
InnoDB
引擎:.frm
文件保存表结构,.ibd
文件或.ibdata
文件保存索引和数据,具体使用哪种文件格式取决于使用独立表空间还是共享表空间,独立表空间使用.ibd
后缀,共享表空间使用.ibdata
后缀.
- 对于
-
InnoDB
不支持全文索引,而MyISAM
支持全文索引.不过MySQL默认实现的全文索引功能不支持中文,因此是一个鸡肋功能. -
InnoDB
不保存表的具体行数,而MyISAM
维护着一个变量记录整个表的行数.InnoDB
执行select count(*) from 表名
时进行全表扫描,而MyISAM
执行select count(*) from 表名
语句时直接查出记录行数的变量(但若SQL语句后存在where
条件,MyISAM
同样要进行全表扫描).
其它MySQL引擎
Memory
引擎:Memory
引擎将数据存储在内存中,只有存储表结构的.frm
文件被存储在磁盘上,一旦关闭MySQL,数据全部消失.NDBCluster
引擎: 主要用于MySQLCluster
分布式集群环境.BLACKHOLE
引擎: 只能写入数据,不能读出数据,类似linux系统下的/dev/null
目录CSV
引擎: 本质上就是维护了一个CSV文件,方标导出CSV表.