一、[常见的三种存储引擎]:存储引擎



### --- 常见的3种存储引擎
### --- 查看MySQL数据的存储引擎有哪些

~~~     # MySQL给用户提供了很多种类的存储引擎, 主要分两大类:
——>        事务安全表: InnoDB
——>        非事务安全表: MyISAM、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等。



SHOW ENGINES;

mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary 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         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+




Mysql都有什么存储引擎 mysql常见的三种存储引擎_java


### --- 查看当前的默认存储引擎 (MySQL5.7 默认使用 InnoDB)

SHOW VARIABLES LIKE '%default_storage_engine%';

mysql> SHOW VARIABLES LIKE '%default_storage_engine%';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+


Mysql都有什么存储引擎 mysql常见的三种存储引擎_mysql_02


### --- 在MySQL中,不需要整个服务器都是用同一种引擎,针对具体的需求,
~~~     可以对 每一个表使用不同的存储引擎 .并且想要进一步优化, 还可以自己编写一个存储引擎.

-- 创建新表时指定存储引擎
create table(...) engine=MyISAM;


二、InnoDB(推荐)


### --- InnoDB

——>        InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,
——>        为用户操作非常大的数据存储提供了一个强大的解决方案。
——>        InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择


### --- 优点

——>        Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别
——>        支持多版本并发控制的行级锁,由于锁粒度小,写操作和更新操作并发高、速度快。
——>        支持自增长列。
——>        支持外键。
——>        适合于大容量数据库系统,支持自动灾难恢复。


### --- 缺点

——>        它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表


### --- 应用场景

——>        当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率
——>        更新密集的表, InnoDB存储引擎特别适合处理多重并发的更新请求。


三、 MyISAM


### --- My了SAM

——>        MyISAM引擎, 不支持事务、也不支持外键,优势是访问速度快,
——>        对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表


### --- 优点

——>        MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服器。
——>        MyISAM存储引擎在查询大量数据时非常迅速,这是它最突出的优点
——>        另外进行大批量插入操作时执行速度也比较快。


### --- 缺点

——>        MyISAM表没有提供对数据库事务的支持。
——>        不支持行级锁和外键。
——>        不适合用于经常UPDATE(更新)的表,效率低。


### --- 应用场景

——>        以读为主的业务,例如:图片信息数据库,博客数据库,商品库等业务。
——>        对数据一致性要求不是非常高的业务(不支持事务)
——>        硬件资源比较差的机器可以用 MyiSAM (占用资源少)


四、MEMORY


### --- MEMORY

——>        MEMORY的特点是 将表中的数据放在内存中,适用于存储临时数据的临时表和数据仓库中的纬度表


### --- 优点

——>        memory类型的表访问非常的快,因为它的数据是放在内存中的


### --- 缺点

——>        一旦服务关闭,表中的数据就会丢失掉。
——>        只支持表锁,并发性能差,不支持TEXT和BLOB列类型,存储varchar时是按照char的方式


### --- 应用场景

——>        目标数据较小,而且被非常频繁地访问。
——>        如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
——>        存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。


五、如何选择存储引擎


### --- 如何选择存储引擎

~~~     不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。
~~~     为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。


特性

InnoDB

MyISAM

MEMORY

存储限制(Storage limits)

64TB

No

Yes

支持事物(Transactions)

Yes

No

No

锁机制(Locking granularity) 

行锁

表锁

表锁

B树索引(B-tree indexes)

Yes

Yes

Yes

哈希索引(Hash indexes)

Yes

No

Yes

外键支持(Foreign key support) 

Yes

No

No

存储空间消耗(Storage Cost) 




内存消耗(Memory Cost)




批量数据写入效率(Bulk insert speed)





### --- 提供几个选择标准,然后按照标准,选择对应的存储引擎

——>        是否需要支持事务;
——>        崩溃恢复,能否接受崩溃;
——>        是否需要外键支持;
——>        存储的限制;
——>        对索引和缓存的支持;