天天看点

如何设计一个关系型数据库(锁,索引)一.为什么要使用索引?二.什么样的信息能成为索引?三.索引的数据结构?

目录

一.为什么要使用索引?

二.什么样的信息能成为索引?

三.索引的数据结构?

关于锁

1.MyISAM和InnoDB关于锁方面的区别是什么?

2.数据库事务的四大特性

3.事务隔离级别以及各级别下的并发访问问题

4.InoDB可重复读隔离级别下如何避免幻读?

5.RC、RR级别下的InnoDB的非阻塞读如何实现?

数据库最终的是存储。所以首要的是一个存储模块(文件系统),可以存在在机械硬盘或者是固态硬盘,光有存储不行,得需要一个程序实例组织这些数据才能使用。所以大方向下分为存储和程序实例。

关于程序实例,其实和做的项目一样,也许对功能进行划分。

首先需要对数据的格式以及文件的分个进行统一的管理,即把物理数据通过逻辑的形式来表示出来,这一功能划分为存储管理。

为了更好的优化程序,引入缓存机制,把取出来的数据存放在缓存里,下次需要的时候,直接从内存返回。

需要提供给外界指令可以操作我们的数据库,所以需要SQL解析模块。

做的sql操作需要记录下来,方便做主从同步或者灾难恢复,因此需要有日志管理办法来记录操作。

再者,需要给用户管理数据的私密空间,即权限划分。

设计系统除了考虑正常的功能,还需要考虑异常的功能,该如何恢复,所以需要引入容灾机制。

为了进一步提高查询的速度,以及支持并发,需要引入最为重要的两个模块:索引管理(提高查询),锁管理(支持并发)。

关于索引

一.为什么要使用索引?

快速查询数据

二.什么样的信息能成为索引?

主键、唯一键、普通键

三.索引的数据结构?

二叉树查找树进行二分查找

建立B-Tree结构

建立B+-Tree结构(Mysql)

索引是建立越多越好吗?

数据量小的表不需要建立索引,建立索引会增加额外的开销,索引也是一些存储在磁盘上的数据。

数据变更需要维护索引,更多的索引意味着更多的维护成本,也意味着需要更多的空间。

关于锁

1.MyISAM和InnoDB关于锁方面的区别是什么?

MyISAM默认用的是表级锁,不支持行级锁

InnoDB默认支持的是行级锁,也支持表级锁

关于MyISAM:假设有一条select语句A对数据库操作需要十秒钟,此时如果有另外一条语句B想要更新某一行(即使不在select的范围钟),那么B语句会等待A语句执行完毕之后再执行,这就是MyISAM的表级锁。其原理是,当执行select的时候,会对表加一个读锁,而对数据进行增删改的时候,会对表加一个写锁,当读锁未被释放的时候,另外一个访问想要增加写锁就会被阻塞,直到所有的读锁被释放。可以使用lock tables [table_name] read;手动给表增加读锁,使用unlock tables;可以解锁。

读锁也称为共享锁,可以理解为两条select语句可以同时对一个数据库操作,即使其中一条执行非常慢。写锁也称为排它锁,即不能同时执行,需等待其它写锁释放才能执行。也可再select语句后面加上for update来手动上排它锁,上共享锁是lock in share mode;。

关于InnoDB:由于InnoDB的事务是自动提交的,所以先把自动事务提交关闭:set  autocommit=0;然后再对某一行进行select操作,同时另外一个session对这一行数据进行写操作,此操作会被阻塞,但如果此时对其它行数据进行写操作,将会很快的执行成功,这就是行级锁。其他操作与共享锁和排它锁的限制基本一致。

值得一提的是,InnoDB在没有用到索引的时候是用的表级锁。(如果不走索引的select添加读锁,那么此时即使是更新不同行也需要等待读锁解锁。

X:排它锁    S:共享锁

如何设计一个关系型数据库(锁,索引)一.为什么要使用索引?二.什么样的信息能成为索引?三.索引的数据结构?

四.数据库事务四大特性(ACID),四种隔离级别

这部分内容有点多,就分开记录了:

原文链接:ACID与隔离级别

1.InoDB可重复读隔离级别下如何避免幻读?

//@todo

2.RC、RR级别下的InnoDB的非阻塞读如何实现?

可以通过 select@@tx_isolation查看当前session事务隔离级别,

//@todo