zoukankan      html  css  js  c++  java
  • Mysql的两种存储引擎以及区别

    主要区别:

    1、MyISAM是非事务安全的,而InnoDB是事务安全

    2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁

    3、MyISAM支持全文类型索引,而InnoDB不支持全文索引

    4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM

    5、MyISAM表保存成文件形式,跨平台使用更加方便

    一、Mysql的两种存储引擎

      1、MyISAM:

        ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性、一致性、隔离性、持久性)

        ②不支持外键,支持表锁,每次所住的是整张表

            MyISAM的表锁有读锁和写锁(两个锁都是表级别):

          表共享读锁和表独占写锁。在对MyISAM表进行读操作时,不会阻塞其他用户对同一张表的读请求,但是会阻塞其他用户对表的写请求;对其进行写操作时会阻塞对同一表读操作和写操作

          MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕! 

        ③一个MyISAM表有三个文件:索引文件,表结构文件,数据文件

        ④存储表的总行数,执行select count(*) from table时只要简单的读出保存好的行数即可

          (myisam存储引擎的表,count(*)速度快的也仅仅是不带where条件的count。这个想想容易理解的,因为你带了where限制条件,原来所以中缓存的表总数能够直接返回用吗?不能用。这个查询引擎也是需要根据where条件去表中扫描数据,进行统计返回的。)

        ⑤采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。

        ⑥支持全文索引和空间索引

        ⑦对于AUTO_INCREMENT类型的字段,在MyISAM表中,可以和其他字段一起建立联合索引。

        MyISAM的主索引图:索引文件的每个数据域存储指向数据文件的指针(每个索引指向了数据地址)

        

        MyISAM的辐索引:索引文件的每个数据域存储指向数据文件的指针(每个索引指向了数据地址),辐索引不用保证唯一性

        

    2、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的辐索引图:

        

        总结大图:

        

    参考来源:传送门

    ---------------------

    个性 签名:真正的学习不是记住知识,而是学会如何提出问题,研究问题,解决问题。

    如果觉得这篇文章对你有小小的帮助的话,记得在下方“关注”哦,博主在此感谢!

  • 相关阅读:
    目前游戏行业内部主要几款游戏引擎的技术对比(转)
    Windows平台下为Python添加MongoDB支持PyMongo
    Android_ContentProvider
    Android 手风琴效果实现
    SQLiteOpenHelper与SQLiteDatabase
    sqlite基础语法
    关于Android studio git Authentication failed
    Android 6.0动态权限获取
    Android_数据存储
    Android_CardView
  • 原文地址:https://www.cnblogs.com/JonaLin/p/14431466.html
Copyright © 2011-2022 走看看