zoukankan      html  css  js  c++  java
  • MySQL 的两种存储引擎

    MyISAM 是MySQL的默认数据库引擎(5.5以后默认是InnoDB)性能极佳,但不支持事务处理。

    InnoDB 是MySQL的数据库常用的数据引擎。

    MyISAM 和 InnoDB 两者之间有明显的区别,简单梳理一下:

    1. 事务
      • MyISAM:每次查询具有原子性,执行速度比i快但是不支持事务操作。
      • InnoDB:提供事务、回滚、崩溃修复能力的事务安全(ACID)型数据引擎
    2. 存储
      • MyISAM:每个MyISAM表在磁盘上存储成三个文件。分别是表定义文件(表名xx.frm)、数据文件(表名xx.MYD)、索引文件(表名xxx.MYI)。MyISAM还支持三种不同的存储格式,动态表,静态表,压缩表,存储开销依次变小,执行开销依次增大。
      • InnoDB:属于索引组织表。有两种存储方式,分别是共享表空间和多表空间存储。
      • 共享表空间:所有的表都保存在同一个数据文件中。InnoDB表文件的大小之受限于操作系统文件的大小。InnoDB在存储上需要更多的内存和磁盘空间,他会在主存中建立其专用的缓冲池用于高速存取数据与索引。
      • 多表空间存储:每个表都有一个表空间用于存储每个表的数据和索引 (表名.idb)。
    3. 数据移植、备份、恢复
      • MyISAM:数据是以稳健的形式存储,所以在跨平台的数据转移中会很方便。可以对单个表进行操作。
      • InnoDB:由于多个表保存在同一个文件中,只能拷贝整体文件,备份binlog,或者用mysqldump。
    4. 主键
      • MyISAM:允许没有任何索引和主键 的表存在,索引保存的是行的地址
      • InnoDB:如果没有设置主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
    5. 外键
      • MyISAM不支持外键,InnoDB支持。
    6. 索引
      • 全文索引:MyISAM全文索引不支持中文(中文需要sphinx),i也支持了(但可以用sphinx插件支持,效果还不错)
      • 另外,MyISAM索引和数据分离,天生非聚簇索引,最多有一个unique的性质。i的数据文件本身就是主键索引文件,这样的索引被称为聚集索引。
      • MyISAM引擎使用b+tree作为索引结构,叶节点的不存放实际数据,存放实际数据的地址,叫做非聚集索引。
      • InnoDB引擎也是用b+tree作为索引结构,但实现方式与m截然不同。一个重大区别是i的数据文件本身就是索引文件(而MyISAM索引文件是与数据文件分离的,主键索引与其他索引在实现上没有区别),子叶节点的数据域部分保存了完整的行记录,这个b+tree的key是表的主键,这种索引叫做聚集索引。
      • 但是,InnoDB中的其他索引在查询时就没有那么幸运了,需要先在其他索引中查询到对应主键,再在聚集索引中查找对应的行。
      • mysql支持三种锁定级别,行级,页级,表级别
      • MyISAM支持表级锁,读写互相阻塞,读阻塞写,写阻塞读写,读不阻塞读。
      • InnoDB支持行级锁(where 字段是主键),表锁,但InnoDB的行锁也不是绝对的,当在执行一个sql语句且mysql不能确定要扫描的范围时,i同样会全表加锁,当确定范围时会加间隙锁。
        • update table set num = 1 where name like ‘%xxx%’; ---退化表锁
        • update table set num = 1 where name = 123             ---隐式转换 退化表锁
        • update table set num = 1 where id >50  -------------------间隙锁
    7. 隔离级别 
      • MyISAM 无隔离级别 只有表锁。
      • InnoDB 隔离级别 (详见下一篇文章)
    8. auto_increment
      • MyISAM 自动增长列必须是索引,如果是组合索引,自动增长列可以不是一地列,他可以根据前面几列排序递增。
      • InnoDB 自动增长列必须是索引,如果是组合索引必须是组合索引的第一列。
    9. 查询行数
      • MyISAM 保存有表的总行数 select count(*) from a;会直接取出对应值。
      • InnoDB 没有保存,需要遍历整张表。
    10. drop table
      • drop table 的处理方式不一样 m会重新建立表,InnoDB不会重新建立表,而是一行一行的删除。因此速度非常慢,推荐是用truncate table。
  • 相关阅读:
    PHP 数组对象 按照某个字段进行排序
    laravel 多条件查询
    PHP QR CODE 类库生成二维码
    TypeError:Cannot read property 'type' of undefined
    input禁止输入的4种方法
    QQ会话调用地址
    禁止左右键复制
    设置Meta标签 清除页面缓存
    百度统计,百度自动推送合并
    强制使用360浏览器 使用webkit内核
  • 原文地址:https://www.cnblogs.com/chafanbusi/p/10657146.html
Copyright © 2011-2022 走看看