MySQL的存储引擎MyISAM和InnoDB

  • Post author:
  • Post category:mysql






\color{pink}{\spadesuit}














不知道你们有没有留意到数据库表里经常看到这样的一句ENGINES=InnoDB DEFAULT,有没有好奇是啥意思?那就一起学习吧~

在这里插入图片描述



数据库引擎


数据库引擎是用于存储、处理和保护数据的核心服务。


当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是通过数据库引擎去访问数据库文件



mysql的两种存储引擎的比较

MySQL5.5 之前默认使用MyISAM ,5.6 以后默认为 InnoDB


InnoDB是事务型数据库的首选引擎

,支持事务安全表(ACID),支持行锁定和外键,其为MySQL数据库5.6及以后版本默认存储引擎。



InnoDB特点介绍及适用场景

MyISAM 和 InnoDB 是许多人在使用MySQL时最常用的两个存储引擎,这两个各有优劣,视具体应用而定。

基本的差别为:


  • MyISAM只支持表级锁

    ,用户在操作MyISAM表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

    不支持外键

  • InnoDB

    支持事务和行级锁

    ,行锁大幅度提高了多用户并发操作的新能。

    支持外键

    ;对一个包含外键的InnoDB表转为MYISAM会失败;
  • MyISAM


    不支持事务处理

    等高级处理,强调的是

    性能


    ,其执行速度比 InnoDB 更快,但是不提供事务支持,而


    InnoDB 提供事务支持

    、外部键

    等高级数据库功能。

InnoDB支持事务和行级锁,是InnoDB的最大特色。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。


如果数据表主要用来插入和查询记录,则 MyISAM 能提供较高的处理效率;如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB 是一个好的选择。

不知道ACID是什么的童鞋可要去了解哦,面试时比较常问到的。可以看下这篇

数据库事务的四大特性及事物的隔离级别



MyISAM和InnoDB两者的应用场景

  1. MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  2. InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

但是实际场景中,针对具体问题需要具体分析,一般而言可以遵循以下几个问题:

  • 数据库是否有外键?
  • 是否需要事务支持?
  • 是否需要全文索引?
  • 数据库经常使用什么样的查询模式?在写多读少的应用中还是Innodb插入性能更稳定,在并发情况下也能基本,如果是对读取速度要求比较快的应用还是选MyISAM。
  • 数据库的数据有多大? 大尺寸倾向于innodb,因为事务日志,故障恢复。

摘自

MySQL两种存储引擎: MyISAM和InnoDB 简单总结



MyISAM和InnoDB存储引擎使用的锁

MyISAM 采用表级锁(table-level locking)。

InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁



数据库中的锁

页级:引擎 BDB

表级:引擎 MyISAM

行级:引擎 INNODB




\color{pink}{\diamondsuit}















表级锁

:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;




\color{pink}{\diamondsuit}















行级锁

:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;




\color{pink}{\diamondsuit}















页面锁

:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。


查看数据库引擎命令

查看MySQL提供的所有存储引擎

show engines

在这里插入图片描述

从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。

查看MySQL当前默认的存储引擎

我们也可以通过下面的命令查看默认的存储引擎。

show databases; # 先查看数据库名
use databse_name; # 进入数据库
show tables_name; # 查看数据库中的表

show table status like "table_name";

在这里插入图片描述



MySQL的存储引擎MyISAM与InnoDB如何选择

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是两个。

关于MySQL数据库提供的两种存储引擎,MyISAM与InnoDB选择使用:

1.InnoDB会支持一些关系数据库的高级功能,如事务功能和行级锁,MyISAM不支持。

2.MyISAM的性能更优,占用的存储空间少,所以,选择何种存储引擎,视具体应用而定。

如果你的应用程序一定要使用事务,毫无疑问你要选择InnoDB引擎。但要注意,InnoDB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。

如果你的应用程序对查询性能要求较高,就要使用MyISAM了。MyISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于InnoDB。压缩后的索引也能节约一些磁盘空间。MyISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。

有人说MyISAM只能用于小型应用,其实这只是一种偏见。如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。

现在一般都是选用InnoDB了,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。


MEMORY存储引擎

MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。

每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。

MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。

注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。

简单了解完数据库引擎后你还需要去了解

数据库索引



数据库事务的四大特性以及事务隔离级别

。一方面可以拓宽自己的知识广度,另一方面也能学的更加系统~,面试常问的考点。



版权声明:本文为weixin_41948075原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。