大白话关系型数据库:索引,事务,锁
2019-10-28 11:06 小花花的世界 阅读(...) 评论(...) 编辑 收藏感谢阅读。也欢迎大家可以去看《MySQL技术内幕》和橘黄色的《算法》。
前言
数据库是软件开发的核心,因为一个软件如果要有状态,也就是它记得你什么时候操作过什么,那么数据要持久化,总要存储在某些地方,这些地方也就是数据库。当然,计算机上面的文件夹,文件,你也可以把它当成数据库,也就是文件数据库,现在很火的hadoop大数据系统其实就是一个分布式文件数据库。
在没有计算机的年代,记账相关的财务都是用纸来记录的,叫账本。而现在,我们有了计算机,有了编程语言,有了数据库系统,所以我们可以编程,将数据插入数据库,查找出数据库中的数据。
历史的选择,关系型数据库因为很符合人的直觉,所以使用的范围最广。顾名思义,关系型数据库,就是数据之间是有关系约束。在这篇文章中,关系型数据库这个词指的是持久化的数据组织形式的综合体,而关系型数据库管理系统指的是操纵这些数据组织形式综合体的软件组合。一个是数据本身,一个是操纵数据软件本身。
大白话
关系型数据库,可以包含很多个二维化的数据结构,叫做表,有行列之分,就像棋盘一样。列是字段,比如性别,年龄,姓名,行是一行行记录:
表1: 人口登记表
编号 性别 年龄 姓名
1 男 22 大大
2 女 34 次奥
非常的直观。
每一行记录可以有个主键,不可重复,比如编号,用以区分这行记录。还可以多个表之间有关系约束,叫做外键:
表2: 资产表
编号 资产数额 所属人编号
1 20000 表1的编号1
2 10000 表1的编号2
这里的所属人编号关联到了表1,这时发生了关系约束,如果你删除了表1中的编号1,那么表2的编号1就查不到这个人,所以不允许删除。
这种关系约束避免了混乱,把相关的数据以强有力的关系模式进行绑定,防止人为失误导致数据丢失或矛盾。
关系型数据库的产生,非常直观地体现了现实世界的各种业务逻辑。
SQL
结构化查询语言SQL(Structured Query Language)是对数据库进行操作的一种形式化计算机语言,这里的数据库,指的是数据,而不是软件。
SQL语句经过数据库管理系统的分词,语义化,可以将数据插入数据库,或者将数据以一定形式查询出来,也可以删除数据。比如:
INSERT INTO `user`(`id`,`age`,`sex`,`name`) VALUES (1,22,"男","大大")
表示将一条数据插入用户表里面,id,age,sex,name是列字段,后面的1,22,"男","大大"是这条数据库记录。
上面这种样子,很好,很强大。
比较有名的数据库管理软件就是人人都用的 MySQL 数据库,这里的数据库指的是数据库软件,而不是数据。MySQL可以将SQL进行解析,然后以一定的形式存储起来。
MySQL/索引和事务
索引
数据库存放的是数据,如何查询数据查得快,那么查找算法就派上用场了。索引,也就是类似于我们中文字典目录中的那些拼音字母,通过字母可以迅速定位到词。
主要的查找算法有拉链法,也就是数组链表,这种实现的方式也可叫哈希索引。
另外一种是树,有B树,以及其衍生的B+树。
拉链法,数组的链表:
0 -> 数据1 -> 数据2
1 -> 数据1 -> 数据2
2 -> 数据1 -> 数据2
3 -> 数据1 -> 数据2
4 -> 数据1 -> 数据2
5 -> 数据1 -> 数据2
竖下来的第一列是一个数组,总共有6个数组元素位置,每一个数组元素后面有一条长长的链。
插入数据时,比如数据主键是8(每一行数据库表记录,主键字段就是索引,因为比较重要,所以叫主键,主要的键),那么8除以6余2,那么将这个数据链接在第二个数组元素的链表中。因为做这个计算公式很快,而定位到这个数组位置更快了,直接用数组的内存位置+数组偏移量*指针位数就可以了。所以用空间换了时间。
0 -> 数据1 -> 数据2
1 -> 数据1 -> 数据2 -> 主键8所在的数据
2 -> 数据1 -> 数据2
3 -> 数据1 -> 数据2
4 -> 数据1 -> 数据2
5 -> 数据1 -> 数据2
这种方式如果数据太多,而数组长度过小,那么数组元素后面的链就越来越长了,那么查找的意义就越来越慢了。
所以有了