MySQL中的表引擎与字符集


概述

服务端处理客户端请求的过程大致可以理解为以下这个图,存储引擎以前被称为表处理器
它是接收上层命令,对表中的数据进行增删改查的操作,第1部分与第2部分这种不涉及对
真实数据存储的功能都被划分至MySQL server
MySQL中的表引擎与字符集


innodb与myisam的区别

  1. 事务支持
    innodb支持acid事务操作,myisam不支持,事务是数据库执行的基本单元
    acid事务的四个特征:
    Atomicity(原子性):要么全都做了,要么全都没做
    Consistency(一致性):串行调度中事务要保持一致性
    Isolation(隔离性):多个事务并行调度时事物具有隔离性互相不影响
    Durability(持久性):一个事务执行完毕,其结果不能丢失,对数据库影响是永久的
  2. 存储结构
    MyISAM:每个MyISAM在磁盘上存储成三个文件
    .frm文件存储表结构
    .MYD文件存储数据
    .MYI文件存储索引
    InnoDB:主要分为两种文件进行存储
    .frm 存储表结构
    .ibd 存储数据和索引(也可能是多个.ibd文件,或者是独立的表空间文件)
  3. 表锁差异
    myisam只支持表级锁,innodb支持行级锁与事务锁
  4. 表主键
    myisam允许没有任何索引和主键的表存在,索引都是保存行的地址
    innodb如果没有设定主键或者非空唯 一索引,就会自动生成一个6字节的主键
  5. 表的具体行数
    myisam保存有表的总行数,如果select count() from table,会直接取出出该值
    innodb没有保存表的总行数,但如果使用where,两者是一样的
  6. CURD操作
    myisam如果执行大量的SELECT,myisam是更好的选择
    innodb如果你的数据执行大量的INSERT或UPDATE,应该使用innodb表
  7. 外键
    myisam不支持,innodb支持
  8. 查询效率
    myisam相对简单,所以在效率上要优于innodb,小型应用可以考虑使用myisam
  9. 应用场景
    默认使用innodb,但如果业务相对较小,没有高并发的需求,且SELECT语句被大量
    地使用,则可以考虑使用myisam

MySQL的字符集

MySQL中的 utf8 字符集分为两个,如果字符集设置utf8,则默认为utfmb3,而不是mb4
utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符
utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符