mysql引擎 区别

一、先看看mysql当前默认存储引擎mysql

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有哪些引擎sql

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支持存储引擎有好几种,我们这里主要讨论一下经常使用的几种存储引擎。Innodb,myisam数据库

索引是 MySQL数据库很重要的一部分,它对数据表查询性能的好坏起着决定性的做用,尤为是对大表做用更加明显。 做为索引中最为常见的一种类型,B-Tree索引大都采用的是 B+Tree数据结构来存储数据(NDB集群存储引擎内部实际上采用 T-Tree结构存储这种索引)。B-Tree一般也意味着全部的值都是按顺序存储的。 大多数的 MySQL引擎都支持这种索引,而不一样的存储引擎以不一样的方式来实现 B-Tree索引,性能方面各有优劣。数据结构

INNODB
INNODB索引实现
与 MyISAM相同的一点是,InnoDB 也采用 B+Tree这种数据结构来实现 B-Tree索引。而很大的区别在于,InnoDB 存储引擎采用“汇集索引”的数据存储方式实现B-Tree索引,所谓“汇集”,就是指数据行和相邻的键值紧凑地存储在一块儿,注意 InnoDB 只能汇集一个叶子页(16K)的记录(即汇集索引知足必定的范围的记录),所以包含相邻键值的记录可能会相距甚远。并发

在 InnoDB 中,表被称为 索引组织表(index organized table),InnoDB 按照主键构造一颗 B+Tree (若是没有主键,则会选择一个惟一的而且非空索引替代,若是没有这样的索引,InnoDB则会隐式地定义一个主键来做为汇集索引),同时叶子页中存放整张表的行记录数据,也能够将汇集索引的叶子节点称为数据页,非叶子页能够看作是叶子页的稀疏索引。app

下图说明了 InnoDB汇集索引的实现方式,同时也体现了一张 innoDB表的结构,能够看到,InnoDB 中,主键索引和数据是一体的,没有分开。: ide



这种实现方式,给予了 InnoDB 按主键检索的超高性能。能够有目的性地选择汇集索引,好比一个邮件表,能够选择用户ID来汇集数据,这样只须要从磁盘读取较少而且连续的数据页就能得到某个id的用户所有的邮件,避免了读取分散页时所耗费的随机I/O。高并发

InnoDB 则是 I/O 操做,Innodb读写采用MVCC来支持高并发。性能

全表扫描:
当InnoDB作全表扫描时并不高效,由于 InnoDB 实际上并无顺序读取,在大多状况下是在随机读取。作全表扫描时,InnoDB 会按主键顺序扫描页面和行。这应用于全部的InnoDB 表,包括碎片化的表。若是主键页表没有碎片(存储主键和行的页表),全表扫描是至关快,由于读取顺序接近物理存储顺序。可是当主键页有碎片时,该扫描就会变得十分缓慢指针

行级锁
提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs),另外,InnoDB表的行锁也不是绝对的,若是在执行一个SQL语句时MySQL不能肯定要扫描的范围,InnoDB表一样会锁全表,例如update table set num=1 where name like “%aaa%”

MYISAM
MyISAM索引的实现
每一个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。MyISAM索引文件【.MYI (MYIndex)】和数据文件【.MYD (MYData)】是分离的,索引文件仅保存记录所在页的指针(物理位置),经过这些地址来读取页,进而读取被索引的行。先来看看结构图

上图很好地说明了树中叶子保存的是对应行的物理位置。经过该值,存储引擎能顺利地进行回表查询,获得一行完整记录。同时,每一个叶子页也保存了指向下一个叶子页的指针。从而方便叶子节点的范围遍历。 而对于二级索引,在 MyISAM存储引擎中以与上图一样的方式实现,这也说明了 MyISAM的索引方式是“非汇集的”,与 Innodb的“汇集索引”造成了对比

MyISAM 默认会把索引读入内存,直接在内存中操做;

表级锁
小结:Innodb强调多功能性,支持的拓展功能比较多,myisam主要侧重于性能

区别InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,因此最好把多条SQL语言放在begin和commit之间,组成一个事务;InnoDB是汇集索引,数据文件是和索引绑在一块儿的,必需要有主键,经过主键索引效率很高。可是辅助索引须要两次查询,先查询到主键,而后再经过主键查询到数据。所以,主键不该该过大,由于主键太大,其余索引也都会很大。而MyISAM是非汇集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。InnoDB不保存表的具体行数,执行select count(*) from table时须要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只须要读出该变量便可,速度很快;Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;如何选择是否要支持事务,若是要请选择innodb,若是不须要能够考虑MyISAM;若是表中绝大多数都只是读查询,能够考虑MyISAM,若是既有读写也挺频繁,请使用InnoDB。系统奔溃后,MyISAM恢复起来更困难,可否接受;MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(以前是MyISAM),说明其优点是有目共睹的,若是你不知道用什么,那就用InnoDB,至少不会差。

相关文章
相关标签/搜索