mysql存储索引都有哪些,有什么区别?
Innodb引擎、MyISAM引擎(Mysql 默认的引擎)
Innodb引擎提供了对数据库ACID的事务支持,并且实现了SQL标准的四种隔离界别。该引擎还提供了行级锁和外键约束,它涉及的目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。
由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,比如只有通过索引条件检索数据,InnoDB才会使用行级锁,否则InnoDB将使用表锁
MyISAM是Mysql默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和InnoDB不同,MyISAM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于些操作且不需要数据库事务的支持,那么MyISAM也是很好的选择。
InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选择InnoDB
MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量select操作,应该选择MyISAM
mysql索引结构都有哪些,有什么区别?
Mysql一共有两种索引结构,一种是B+Tree索引,一种是Hash索引
B+Tree是mysql使用最频繁的一个索引数据结构,是InnoDB和MyISAM存储引擎模式的索引类型。相对Hash索引,B+Tree在查找单条记录的速度比不上Hash索引,但是因为更适合排序等操作,所以它更受欢迎。毕竟不可能只对数据库进行单条记录的操作。
Hash索引把数据以hash形式组织起来,因此当查找某一条记录的时候,速度非常快。但是因为hash结构,每个键只对应一个值,而且是散列的方式分布。所以它并不支持范围查找和排序等功能。
B+tree索引结合和Btree区别?
在B树中,你可以将键和值存放在内部节点和叶子节点,但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。
B树:B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。
B+树:B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。B+树的叶子节点由一条链相连,因此,当需要进行一次全数据遍历时非常适合,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可,而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间
(A - 原子性 - Atomicity 事务内的操作要么全部成功,要么全部回滚撤销)
(C - 一致性 - Consistency 事务执行前后,数据库必须从一个“满足约束”的合法状态,变到另一个“满足约束”的合法状态)
(I - 隔离性 - IsoLation - 并发执行多个事务时,每个事务看起来,像是独占数据库在运行)
(D - 持久性 - Durability - 事务一旦提交成功,结果必须在故障(断电、崩溃)后仍然存在
四种隔离级别:读末提交(RU)、读已提交(RC)、可重复读(RR)、串行化(Serializable)
读末提交(RU):最低级别,事务能读到别人还没提交的数据,脏读、不可重复读、幻读都可能发生,基本没人用。
读已提交(RC):只读已提交的数据,解决了脏读,但不可重复读和幻读仍可能。每次SELECT都会生成新的快照,互联网高并发场景常用。
可重复读(RR):InnoDB的默认级别,事务首次SELECT创建快照后复用,解决了不可重复读。配合Next-Key Lock还能解决大部分幻读。
Next-Key Lock:本质上是两种锁的组合体,即锁住已有的数据行,也锁住数据行之间的空隙,防止其他事务插入新数据。Record Lock(记录锁) 和 Gap Lock(间隙锁)
串行化(Serializable):最高级别,强制事务串行执行,读写都加锁,能解决所有并发问题,但性能最差,几乎不用
Innodb引擎 - 行级锁
锁的本质:行级锁实际锁定的是索引记录,而非物理数据行本身,依赖索引才能精准定位行
两大基础模式:
共享锁(S锁):多个事务可同时持有,允许其他事务读取但禁止修改对应行
排他锁(X锁):仅一个事务可持有,完全禁止其他事务对该行的读写操作
衍生锁类型:
间隙锁:RR隔离级别下用于防止幻读,锁定索引记录间的空白区间,不针对具体行
临键锁:行锁+间隙锁的组合,是RR隔离级别下InnoDB的默认行锁算法
关键特性:查询未命中索引时,行锁会退化为全表锁,严重影响并发性能
InnoDB外键约束核心规则
基础生效前提:仅InnoDB引擎支持外键,MySAM引擎即使写了外键语法也完全无效