数据库

数据库事务

程序执行单元。
作用

  • 提供数据库操作从异常中恢复到正常状态的方法,保证异常情况下数据一致性
  • 多个应用或者多个线程访问数据库隔离。

特点

  • ACID

数据库锁

并发下保证稳定性数据一致性。引擎有关。
数据一致性问题:

  • 脏读
  • 不可重复读
  • 幻读

对应解决:
事务隔离机制。

  • 读未提交
  • 读提交
  • 可重复读
  • 串行化

表级别锁(myISM)

意向锁(Intention Locks)
意向锁是一种表级锁,用来指示接下来的一个事务将要获取的是什么类型的锁(共享还是独占)

行级别锁(InnoDB)

mysql默认innoDB。支持事务,支持行级别锁。
共享锁(s)
SELECT * FROM category WHERE category_no = 2 lock in SHARE mode; //共享锁
独占锁(x)
SELECT * FROM category WHERE category_no = 2 for UPDATE; //独占锁
UPDATE category set category_name = '动漫' WHERE category_no = 2; //独占锁
记录锁(record Locks)

间隙锁

隙锁是一种记录行与记录行之间存在空隙或在第一行记录之前或最后一行记录之后产生的锁。间隙锁可能占据的单行,多行或者是空记录。

MYSQL锁

  • MySQL会对不存在的记录加gap锁,加gap锁的目的是防止幻读。同时在事务1对某条不存在的记录加锁的过程中,禁止插入其他新记录,所以MySql中对不存的记录加锁相当于此表不能插入任何记录,非常危险,在实际的业务中一定要注意。
  • 对于普通索引加锁,事务会对数据加next-key锁(即记录锁加上gap锁),因为考虑到B+树索引的有序性,满足条件的项一定是连续存放的,加gap锁防止幻读,必须要保证一事务内连续两次读出都是一样,所以上面的插入必定失败,不在范围的数据插入才会成功
  • 对唯一索引的记进行读取,其他事务可以向表插入新的记录,不能更新已加锁的记录,可以更新其他未加锁的记录,说明此时对表中已存在的记录只加排他锁。
  • 对主键加锁读只会对该记录加排他锁,不会影响其他事务对记录的插入和更新。
  • 无索引条件下加锁读数据时,会导致全表加上索引,其他事务全部阻塞,数据库基本会处于不可用状态。

索引

作用
加快查询
原理

  • 为什么树不是hash
    加速查找速度的数据结构,常见的有两类:
    (1)哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1);
    (2)树,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n));
    select * from t where name=”sh”;
    确实是哈希索引更快,因为每次都只查询一条记录。但是排序查询的SQL需求:分组:group by。排序:order by。比较:<、>。哈希型的索引,时间复杂度会退化为O(n),而树型的“有序”特性,依然能够保持O(log(n)) 的高效。
  • 为什么是B+
    二叉树
    image.png
  • 当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢;
  • 每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO
    B树
    image.png
  • 不再是二叉搜索,而是m叉搜索;
  • 叶子节点,非叶子节点,都存储数据;
  • 中序遍历,可以获得所有节点;
    B树被作为实现索引的数据结构被创造出来,是因为它能够完美的利用“局部性原理”。
    局部性原理的逻辑是这样的:
    (1)内存读写块,磁盘读写慢,而且慢很多;
    (2)磁盘预读:磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据,每次加载更多的数据,如果未来要读取的数据就在这一页(4k)中,可以避免未来的磁盘IO,提高效率;
    (3)局部性原理:软件设计要尽量遵循“数据读取集中”与“使用到一个数据,大概率会使用其附近的数据”,这样磁盘预读能充分提高磁盘IO;
    为啥用B树
    (1)由于是m分叉的,高度能够大大降低;
    (2)每个节点可以存储j个记录,如果将节点大小设置为页大小,例如4K,能够充分的利用预读的特性,极大减少磁盘IO;
    b+树
    image.png

    (1)范围查找,定位min与max之后,中间叶子节点,就是结果集,不用中序回溯
    (2)叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加速,适合内存存储;
    (3)非叶子节点,不存储实际记录,而只存储记录的KEY的话,那么在相同内存的情况下,B+树能够存储更多索引;
    总结
  • 数据库索引用于加速查询
  • 虽然哈希索引是O(1),树索引是O(log(n)),但SQL有很多“有序”需求,故数据库使用树型索引
  • InnoDB不支持哈希索引
  • 数据预读的思路是:磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据,每次加载更多的数据,以便未来减少磁盘IO
  • 局部性原理:软件设计要尽量遵循“数据读取集中”与“使用到一个数据,大概率会使用其附近的数据”,这样磁盘预读能充分提高磁盘IO
    数据库的索引最常用B+树:
    (1)很适合磁盘存储,能够充分利用局部性原理,磁盘预读;
    (2)很低的树高度,能够存储大量数据;
    (3)索引本身占用的内存很小;
    (4)能够很好的支持单点查询,范围查询,有序性查询;

1、面试你应该知道的 MySQL 的锁(20190706)

https://mp.weixin.qq.com/s/Oe_NzPAL7OazlR4m56trvQ

2、漫话:MySQL中的行级锁表级锁页级锁(20190706)

https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484688&idx=1&sn=be0770d03ef3aee8c317fa4b7f14a433&source=41#wechat_redirect

3、漫话:彻底理解数据库事务(20190707)

https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484695&idx=1&sn=d734ce0c79169ab51b63302e0d27952d&source=41#wechat_redirect

3、数据库索引,到底是什么做的?(20190710)

https://mp.weixin.qq.com/s/YMbRJwyjutGMD1KpI_fS0A

3、InnoDB,select为啥会阻塞insert?(20190710)

https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961471&idx=1&sn=da257b4f77ac464d5119b915b409ba9c&chksm=bd2d0da38a5a84b5fc1417667fe123f2fbd2d7610b89ace8e97e3b9f28b794ad147c1290ceea&scene=21#wechat_redirect

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

推荐阅读更多精彩内容

  • 一、简介 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种...
    huangxiongbiao阅读 429评论 0 0
  • 文章导读: 累兮,累兮,要死兮...... 本文解决问题: 1、表级锁定(读锁、写锁) 2、行级锁定(共享锁、排他...
    创造new_world阅读 637评论 0 1
  • 数据库的锁机制 并发控制 在计算机科学,特别是程序设计、操作系统、多处理机和数据库等领域,并发控制(Concurr...
    梦醒家先生阅读 539评论 0 1
  • msyql -uroot -p123456 msyqladmin -uroot -p123456 GPG keys...
    nhsf阅读 1,348评论 0 0
  • 失控是件很可怕的事儿,这里说的可怕一词,不仅仅指的是贬义,还有褒义。 人人都清楚贬义意味着什么,人人都期望自己勇敢...
    QHZPJ阅读 336评论 1 0