什么是存取引擎?
简单来说,数据库对同样的数据,有着不同的存储方式和管理方式,在mysql中,称为存储引擎。
注意一点,存储引擎是基于表的,一个表对应一个存储引擎,库可能存在多个存储引擎。
一般我们mysql默认的存储引擎是InnoDB;
mysql> show variables like '%storage_engine%';
+----------------------------------+-----------+
| Variable_name | Value |
+------------
----------------------+-----------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB |
| internal_tmp_mem_storage_engine | TempTable |
+----------------------------------+-----------+
5 rows in set (0.11 sec)
那么mysql还支持那些存储引擎呢?
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| 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 |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| 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 |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
以上就是我们mysql支持的存储引擎,下面我们主要来前显浅显的谈谈MyISAM ,InnoDB ,MEMORY,ARCHIVE四种存储引擎;
关于下问提到的锁机制、事务、索引等在后面几篇文章会详细说明。
MyISAM
- 存数据存储形式及特点:
MyISAM采用的是索引与数据分离的形式,将数据保存在三个文件中.frm .myd .myi,MyISAM是基于非聚簇索引进行存储的,数据存储在磁盘,底层为B+树索引。
- 锁的粒度
MyISAM不支持行锁,支持的是表锁,所以读取时对表加上共享锁,在写入是对表加上排他锁。由于是对整张表加锁,相比InnoDB,在并发写入时效率很低。
- 事务
:MyISAM不支持事务。
- 其他
MyISAM提供了大量的特性,包括全文索引,压缩,空间函数,延迟更新索引键等。
进行压缩后的表是不能进行修改的,但是压缩表可以极大减少磁盘占用空间,因此也可以减少磁盘IO,从而提供查询性能。
全文索引,是一种基于分词创建的索引,可以支持复杂的查询。
延迟更新索引键,不会将更新的索引数据立即写入到磁盘,而是会写到内存中的缓冲区中,只有在清除缓冲区时候才会将对应的索引写入磁盘,这种方式大大提升了写入性能。
InnoDB
- 数据存储形式特点
使用InnoDB时,会将数据表分为.frm 和 idb两个文件进行存储;索引会当做数据的一部分和数据一起存放,离散程度低,为聚集索引,数据存取在磁盘,底层为B+树索引。
- 锁的粒度
InnoDB采用MVCC(多版本并发控制)来支持高并发,InnoDB实现了四个隔离级别,默认级别是REPETABLE READ(可重复读,第三级别),并通过间隙锁策略防止幻读的出现。它的锁粒度是行锁,当然在特殊情况下会变为表锁。
- 事务
InnoDB是典型的事务型存储引擎,并且通过一些机制和工具,支持真正的热备份。
MEMORY
- 数据存储形式特点
MEMORY的数据存取是在内存中,如果数据库重启或者宕机,表数据就会丢失。非常适合存储一些临时表,默认的是哈希索引,不是B+树索引;
varchar()默认是按照char()存储的,浪费内存,但是能极大的提高数据带入带出的效率。
- 其他
不支持text和BLOB类型。如果数据中有text和BLOB类型,数据库会把这些数字转换到磁盘上。
- 锁的粒度
支持表锁
ARCHIVE
不支持索引,只支持INSERT和SELECT操作,使用压缩算法将数据进行压缩后存储,压缩比例一般是1:10,主要提供插入和压缩功能。