mysql 常用有innodb和myisam两种存储引擎,主要区别:
innodb:支持事务;聚集索引
myisam:不支持事务;非聚集索引
相同点:都是以B+tree来存储数据的
基本概念:
B-tree
Picture1.pngB+tree:
Picture2.png主要区别:(data表示除主键以外的数据信息)
B+tree的非叶子节点不存储data,叶子结点多了指针存储(也就是叶子结点一定是从小到大顺序排的)
由于B+tree的非叶子结点不存储数据部分,所以单个结点可以保存更多的key,因此tree的高度会减小,减少i/o耗时。
说明:
- 数据保存:
innodb有.frm文件(表结构)和.idb文件(索引和数据文件);
myisam有.frm文件(表结构),myi文件(索引)和myd文件(数据文件)
-
data部分是根据表的存储引擎不同而不同的,innodb的主键索引的data是除主键之外的的数据信息,二级索引的data是主键信息,通过主键信息查询其他数据信息,所以当有多个索引的时候,会有多个B+tree,但数据信息只存储一份;myisam的data是该索引对应的数据信息地址,通过地址查询数据信息(i/o)
-
聚集索引:data是数据信息的索引,也就是innodb的主键索引。
-
由于mysql给每个节点分配的是16kb的大小,tree的高度控制在3—4,因此单表存储的数据量大约达千万级别的数据量可以保证正常速度的数据查询,超过这个级别的数据考虑别的解决方案(后面持续更新)
事务:事务是一系列sql语句的结合,具有原子性、一致性、持久性和隔离性
事务的隔离性是通过锁来实现
持久性是通过重做日志来实现的
一致性和原子性是通过回滚日志来实现的
数据库并发操作引起的问题:
-
脏读,同一事务中前后两次读取同一数据结果是不同的,是由于另一事务对相同数据修改后进行回滚后导致的。
-
不可重复读,同一事务中前后两次读取同一数据结果是不同的,是由于另一事务对相同数据修改后进行提交后导致的。
-
幻读,同一事务中前后两次读取同一数据结果是相同的,但出现了新的记录或者可能插入不了某些记录,如第一次查的时候有id为1,2,3三条记录,第二次查的时候有了1,2,3,4条或者还是1,2,3,但想插入id=4条记录的时候发现插入不了,原因是另一事务插入了id=4的记录。这是由于另一事务对其他记录的插入和删除引起的
事务隔离级别:(由低到高),解决上面并发引起的问题
1, 读未提交:等于没有隔离,任何事务对数据的操作都是任意的,因此并发能力最强,但数据都是不可靠的,没有解决上面三个问题;
2,读提交:一个事务的写操作只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。解决脏读问题;(oracle和SQLserver默认隔离级别)
3,可重复读:决不可重复读问题(1,2属于不可重复读),;(mysql的默认隔离级别)
4,串行读:强制多个事务串行处理,解决所有问题,但并发能力差
注:【2】【3】上面提到的共享锁只的是行级共享锁,【4】中提到的都是表级锁
扩展
索引存储结构还有
二叉树:弊端,索引单边增长时,没有起到作用;
红黑树:比二叉树效率更高,但数据量大时,tree的高度太高,性能也低
Hash:对数据进行hash计算正好等于某个记录的地址,等值查询效率高,非等值查询效率低
Tree的高度表示当查询的数据在叶子结点时最小的i/o次数,所以要尽量减少tree的高度;key表示的是索引字段的值。
网友评论