这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
InnoDB
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
MYISAM中间节点都是索引的key,值为MYD中的数据的地址。(非聚集索引)
使用B+tree索引但是和Innodb的在具体实现上有些不同。
不支持事务,不支持行级锁,只支持并发插入的表锁,主要用于高负载的select
存储为三个文件.frm .MYD .MYI frm表示表结构,MYD表示为MYData,MYI表示MyIndex
特点:表锁,不支持事物,并发性能差
- 优点
- 占用空间小,处理速度块
- 适合用于查询多的数据
- 缺点
- 不支持事务
MEMORY
- 使用存储在内存中的内容来创建表,而且数据全部放在内存中
- 只有一个文件.frm和表名一致,内容都存储在内存中。
- 优点:
- MEMORY默认使用哈希索引。速度比使用B型树索引快。
- 缺点:
- 一次性的,存在内存中,关机就没了
使用选择
- innodb:频繁更新,删除操作,并发要求高,使用innodb引擎来获得事务支持。 (修,删多)
- MyISAM:频繁插入,和读取的操作,并发要求比较低的,使用MyISM可。(读的多)
- 小的表,需要快速读写,一般需要临时表的都用这个。(读的快)
表锁不会发生死锁,其他的锁会发生。因为表锁会一次锁住所有的相关连的表,没有事物能和其互相等待。