• 每日五道java面试题之mysql数据库篇(五)


    在这里插入图片描述

    第一题. 联合索引是什么?为什么需要注意联合索引中的顺序?

    MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。
    具体原因为:
    MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。

    第二题. 什么是数据库事务?

    事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

    事务最经典也经常被拿出来说例子就是转账了。

    假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

    第三题. 事物的四大特性(ACID)介绍一下?

    关系性数据库需要遵循ACID规则,具体内容如下:
    在这里插入图片描述

    1. 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
    2. 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
    3. 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
    4. 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

    第四题. 按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法?

    在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。

    • MyISAM和InnoDB存储引擎使用的锁:
    • MyISAM采用表级锁(table-level locking)。

    InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
    行级锁,表级锁和页级锁对比
    行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
    特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    表级锁 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
    特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
    页级锁 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
    特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

    第五题. 从锁的类别上分MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了

    从锁的类别上来讲,有共享锁和排他锁。
    共享锁: 又叫做读锁。 当用户要进行数据的读取时,对数据加上共享锁。共享锁
    可以同时加上多个。
    排他锁: 又叫做写锁。 当用户要进行数据的写入时,对数据加上排他锁。排他锁
    只可以加一个,他和其他的排他锁,共享锁都相斥。

    用上面的例子来说就是用户的行为有两种,一种是来看房,多个用户一起看房是可以接受的。 一种是真正的入住一晚,在这期间,无论是想入住的还是想看房的都不可以。

    锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁。
    他们的加锁开销从大到小,并发能力也是从大到小。

    如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
    在这里插入图片描述

  • 相关阅读:
    解决ROS2报错colcon build: Duplicate package names not supported
    【一起来学C++】————(7)多态
    【Linux】【开发】Linux shell环境下如何产生随机数
    Leetcode P640
    MCSM面板搭建教程和我的世界Paper服务器开服教程
    抖音招聘直播报白有成本低和招聘效果精准的优势
    Centos7安装Mysql8
    图像处理:推导Canny边缘检测算法
    解决Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题
    云原生Docker数据管理
  • 原文地址:https://blog.csdn.net/m0_74436895/article/details/136488828