Mysql的两种存储引擎以及区别

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

相关文章
相关标签/搜索