1、Mysql的两种存储引擎html
一、MyISAM:sql
①不支持事务,可是整个操做是原子性的(事务具有四种特性:原子性、一致性、隔离性、持久性)缓存
②不支持外键,支持表锁,每次所住的是整张表安全
MyISAM的表锁有读锁和写锁(两个锁都是表级别):并发
表共享读锁和表独占写锁。在对MyISAM表进行读操做时,不会阻塞其余用户对同一张表的读请求,可是会阻塞其余用户对表的写请求;对其进行写操做时会阻塞对同一表读操做和写操做spa
MyISAM存储引擎的读锁和写锁是互斥的,读写操做是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另外一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先得到锁。不只如此,即便读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求以前!这是由于MySQL认为写请求通常比读请求要重要。这也正是MyISAM表不太适合于有大量更新操做和查询操做应用的缘由,由于,大量的更新操做会形成查询操做很难得到读锁,从而可能永远阻塞。这种状况有时可能会变得很是糟糕! 操作系统
③一个MyISAM表有三个文件:索引文件,表结构文件,数据文件.net
④存储表的总行数,执行select count(*) from table时只要简单的读出保存好的行数便可指针
(myisam存储引擎的表,count(*)速度快的也仅仅是不带where条件的count。这个想一想容易理解的,由于你带了where限制条件,原来因此中缓存的表总数可以直接返回用吗?不能用。这个查询引擎也是须要根据where条件去表中扫描数据,进行统计返回的。)htm
⑤采用非汇集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,可是辅索引不用保证惟一性。
⑥支持全文索引和空间索引
⑦对于AUTO_INCREMENT类型的字段,在MyISAM表中,能够和其余字段一块儿创建联合索引。
MyISAM的主索引图:索引文件的每一个数据域存储指向数据文件的指针(每一个索引指向了数据地址)
MyISAM的辐索引:索引文件的每一个数据域存储指向数据文件的指针(每一个索引指向了数据地址),辐索引不用保证惟一性
二、Innodb:
①支持事务,支持事务的四种隔离级别;是一种具备事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
②支持行锁和外键约束,所以能够支持写并发
③不存储总行数;也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。注意的是,当count(*)语句包含 where条件时,两种表的操做是同样的。
④对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引
⑤DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除
⑥一个Innodb表存储在一个文件内(共享表空间,表大小不受操做系统的限制),也可能为多个(设置为独立表空间,表大小受操做系统限制,大小为2G),受操做系统文件大小的限制
⑦主键索引采用汇集索引(索引的数据域存储数据文件自己),辅索引的数据域存储主键的值;所以从辅索引查找数据,须要先经过辅索引找到主键值,再访问主键索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
Innodb的主索引图:(索引位置上存储的直接是数据自己)
Innodb的辐索引图:
总结大图:
参考:
https://www.cnblogs.com/wangdake-qq/p/7358322.html
https://blog.csdn.net/qq_35181209/article/details/78030110