数据库

[toc]

索引

索引优化是对查询性能优化的最有效手段。是存储引擎能够快速定位记录的秘密武器。

索引的数据结构

InnoDB存储引擎大多情况下使用B+树建立索引,这是关系型数据库中查找最为常用和有效的索引,但是B+树索引并不能找到一个给定键对应的具体值,它只能找到数据对应的页,数据库把整个页读入到内存中,并在内存中查找具体的数据行。
B+树是平衡树,查找任意节点消耗的时间相同,因此比较次数就是B+树的高度。

聚集索引和辅助索引

数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。聚集索引存放一条记录的全部信息,辅助索引只包含索引列和一个用于查找对应行记录的书签。
聚集索引:正常的表应该有且仅有一个聚集索引(绝大多数情况下是主键),表中的所有记录数据都是按照聚集索引的顺序存放的。
辅助索引:叶节点不包含行记录的全部数据,仅包含索引中的所有键和一个用于查找对应行记录的书签,辅助索引只用于加速数据的查找。

锁的出现是为了处理并发问题,数据库是一个多用户的资源,当出现并发的时候就会出现例如读“脏”数据,修改丢失等问题。数据库并发需要使用事务控制,事务并发又需要锁来控制。

乐观锁和悲观锁

乐观锁和悲观锁都是并发控制的机制,在原理上有本质区别
乐观锁:是一种思想,并不是一种真正的锁。读取数据时不担心被修改,在更新时判断是否被修改过,没被修改就更新,否则重试。
悲观锁:一种真正的锁。在获取资源前就对资源加锁,确保同一时刻只有有限的线程能够访问该资源,其他想获取的操作都会进入等待状态。
乐观锁适用于读操作较多的场景,不会存在死锁的问题,但是冲突频繁和重试成本高时还是推荐使用悲观锁。

共享锁和互斥锁

对数据的操作只有两种:读和写,针对这两种InnoDB实现了标准的行级锁。只对某一个数据加锁。
共享锁(读锁):允许事务对一条行数据进行读取。之间兼容
互斥锁(写锁):允许事务对一条行数据进行删除和更新。与其他任意锁都不兼容
思考WHY这么设计:因为我们可以对数据库并行读,串行写。这样不会发生线程竞争,实现线程安全。

意向锁

意向锁属于表级锁。对当前操作的整张表加锁。
意向共享锁:事务想在获得表中某些记录的共享锁,需要在表上先加意向共享锁
意向互斥锁:事务想在获得表中某些记录的互斥锁,需要在表上先加意向互斥锁。

锁的算法

锁是如何添加到对应的数据行上的。
Record Lock(记录锁):加到索引记录上的锁。
Gap Lock(间隙锁):对索引记录中的一段连续区域的锁。SELECT * FROM ... FOR UPDATE
Next-Key Lock:记录锁和间隙锁的结合,解决幻读的问题。

事务

事务四大特性

Automatic(原子性):一个事务要么完全发生,要么完全不发生
Consistency(一致性):事务把数据库一个一致状态变为另一个一致状态
Isolation(隔离性):在一个事务提交之前,其他事务察觉不到事务的影响
Durability(持久性):一旦事务提交,将是永久被保存的

事务四种隔离级别

  • Read Uncommitted (读未提交):查询时是不加锁,更新时加行级共享锁,可能读到未提交的行(Dirty Read)
  • Read Committed(读已提交):查询是只对记录加记录锁,不会在记录之间加间隙锁,所以允许新纪录插入到被锁定记录的附近。多次查询时可能得到不同结果(Non-Repeated Read)。
  • Repeated Read(可重复读):查询时加行级共享锁,多次读取同一范围的数据会返回第一次查询的快照,不会返回不同的数据行,可能会发生幻读
  • Serializable(串行化):读取时加表级共享锁,更新时加表级排它锁。

四种隔离级别下的问题

脏读:一个事务中,读取了其他事务未提交的数据
不可重复读:一个事务中,同一行记录被访问两次得到不同结果
幻读:在一个事务中,同一个范围内的记录被读取时,其他事务向这个范围添加了新的记录

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容