mysql常见存储引擎

446 阅读3分钟

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

InnoDB

image.png Innodb只有一个文件,所以只能按照主键来组织索引的。他不需要MYISAM那样 数据一个文件,索引一个文件。而是该文件里面本身就是索引+数据的一个索引树。(聚集索引)

如果存在副索引如name,该索引key所存的值是主键的值。

如果是联合索引:依照最左原则进行大小比较,中间节点为联合索引的值。

优化:(如果有多个索引,尽量使用联合索引,然后sql按照联合索引的顺序进行排列:减少索引文件的大小,减少索引的重排列,这样就减少IO的消耗)

索引使用的是B+Tree。

表结构存储在.frm文件中,数据和索引存储在innodb_data_home_dir和innodb_data_file_path定义。事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全,即提供了事务的支持。支持外键,支持mvcc的行级锁。

特点:事物,行,页锁

  • InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点意味着:**只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!**Oracle是使用的数据来加锁。
  • 主要两种锁:
    • 共享锁 read:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
    • 排他锁 write:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
  • 优点
    • 提供了事务的支持
  • 缺点
    • 读写效率较差,占用的数据空间相对较大。
    • 行锁容易死锁

MyISAM

image.png

MYISAM中间节点都是索引的key,值为MYD中的数据的地址。(非聚集索引)

使用B+tree索引但是和Innodb的在具体实现上有些不同。

不支持事务,不支持行级锁,只支持并发插入的表锁,主要用于高负载的select

存储为三个文件.frm .MYD .MYI frm表示表结构,MYD表示为MYData,MYI表示MyIndex

特点:表锁,不支持事物,并发性能差

  • 优点
    • 占用空间小,处理速度块
    • 适合用于查询多的数据
  • 缺点
    • 不支持事务

MEMORY

  • 使用存储在内存中的内容来创建表,而且数据全部放在内存中
  • 只有一个文件.frm和表名一致,内容都存储在内存中。
  • 优点:
    • MEMORY默认使用哈希索引。速度比使用B型树索引快。
  • 缺点:
    • 一次性的,存在内存中,关机就没了

使用选择

  • innodb:频繁更新,删除操作,并发要求高,使用innodb引擎来获得事务支持。 (修,删多)
  • MyISAM:频繁插入,和读取的操作,并发要求比较低的,使用MyISM可。(读的多)
  • 小的表,需要快速读写,一般需要临时表的都用这个。(读的快)

表锁不会发生死锁,其他的锁会发生。因为表锁会一次锁住所有的相关连的表,没有事物能和其互相等待。