zoukankan      html  css  js  c++  java
  • 数据库面试题汇总

    1),********说一下 ACID 是什么?
    ******************
    原子性(Atomicity)
    一个事务必须被视为一个不可分割的最小工作单元,整个事务中的
    所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来
    说,不可能只执行其中的一部分操作,这就是事务的原子性
    一致性(Consistency)
    数据库总是从一个一致性的状态转换到另一个一致性的状态。(在
    前面的例子中,一致性确保了,即使在执行第三、四条语句之间时
    系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交
    ,所以事务中所做的修改也不会保存到数据库中。)
    隔离性(Isolation)
    通常来说,一个事务所做的修改在最终提交以前,对其他事务是不
    可见的。(在前面的例子中,当执行完第三条语句、第四条语句还
    未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支
    票帐户的余额并没有被减去200美元。)
    持久性(Durability)
    一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使
    系统崩溃,修改的数据也不会丢失。)

    2). *****************说一下乐观锁和悲观锁?
    乐观锁:对加锁持有一种乐观的态度,即先进行业务操作,不到最
    后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步
    更新数据的时候在进行加锁。乐观锁的实现方式一般为每一条数据
    加一个版本号
    update时判断这个版本号是否和数据库里的一致,提交数据前后是
    否冲突。
    update是单线程的,及如果一个线程对一条数据进行update操作,
    会获得锁,其他线程如果要对同一条数据操作会阻塞,直到这个线
    程update成功后释放锁。

    悲观锁:悲观锁对数据加锁持有一种悲观的态度。因此,在整个数
    据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数
    据库提供的锁机制
    备注,在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set
    autocommit=0。MySQL默认使用自动提交autocommit模式,也即你执
    行一个更新操作,MySQL会自动将结果提交

    3),*************************排它锁 & 共享锁你了解吗 ?

    首先说明:数据库的增删改操作默认都会加排他锁,而查询不会加
    任何锁。都是行级锁
    |--共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可
    以读该资源(也可以再继续加共享锁,即 共享锁可多个共存),但
    无法修改。要想修改就必须等所有共享锁都释放完之后。语法为:
    select * from table lock in share mode

    |--排他锁:对某一资源加排他锁,自身可以进行增删改查,其他人
    无法进行任何操作。语法为:
    select * from table for update

    4). ********************说一下 mysql 的行锁和表锁

    行锁的劣势:开销大;加锁慢;会出现死锁
    行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力

    表锁的优势:开销小;加锁快;无死锁
    表锁的劣势:锁粒度大,发生锁冲突的概率高,并发处理能力低
    1 InnoDB 支持表锁和行锁,使用索引作为检索条件修改数据时采用
    行锁,否则采用表锁。
    2 InnoDB 自动给修改操作加锁,给查询操作不自动加锁
    3 行锁可能因为未使用索引而升级为表锁,所以除了检查索引是否
    创建的同时,也需要通过explain执行计划查询索引是否被实际使用
    4 行锁相对于表锁来说,优势在于高并发场景下表现更突出,毕竟
    锁的粒度小。
    5 当表的大部分数据需要被修改,或者是多表复杂关联查询时,建
    议使用表锁优于行锁。
    6 为了保证数据的一致完整性,任何一个数据库都存在锁定机制。
    锁定机制的优劣直接影响到一个数据库的并发处理能力和性能
    若你不清楚InnoDB的行锁会升级为表锁,那以后会吃大亏的

    5). 说一下数据库的事务隔离?

    更新丢失----read uncommitted(读未提交)
    脏读------写禁止读,防止脏读
    不可重复读-----repeatable read 可重复读取
    幻读(虚读)-------serializable 序列化

    6).******mysql 的内连接、左连接、右连接有什么区别?

    1.内连接,显示两个表中有联系的所有数据;
    select a.*,b.* from a inner join b on a.id=b.parent_id
    2.左链接,以左表为参照,显示所有数据,右表中没有则以null显示
    select a.*,b.* from a left join b on a.id=b.parent_id
    3.右链接,以右表为参照显示数据,,左表中没有则以null显示
    select a.*,b.* from a right join b on a.id=b.parent_id
    补充:完全连接 显示两个表中所有的数据
    select a.*,b.* from a full join b on a.id=b.parent_id

    7),mysql 索引是怎么实现的?

    索引是满足某种特定查找算法的数据结构,而这些数据结构会以某
    种方式指向数据,从而实现高效查找数据。
    具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前
    主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可
    以到达二分法的性能,找到数据区域之后就找到了完整的数据结构
    了,所有索引的性能也是更好的。

    8). 怎么验证 mysql 的索引是否满足需求?

    使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索
    引是否满足需求。
    explain 语法:explain select * from table where type=1。

    9). 说一下 mysql 常用的引擎?


    InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并
    且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据
    容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓
    冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时
    启动也比较的慢,它是不会保存表的行数的,所以当进行 select
    count(*) from table 指令的时候,需要进行扫描全表。由于锁的
    粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用
    会提升效率的。
    MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持,也不支持
    行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时
    候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同
    的是,MyIASM 引擎是保存了表的行数,于是当进行 select count
    (*) from table 语句时,可以直接的读取已经保存的值而不需要进
    行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需
    要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

    10). mysql 问题排查都有哪些手段?

    使用 show processlist 命令查看当前所有连接信息。
    使用 explain 命令查询 SQL 语句执行计划。
    开启慢查询日志,查看慢查询的 SQL。


    11). 如何做 mysql 的性能优化?

    为搜索字段创建索引。
    避免使用 select *,列出需要查询的字段。
    垂直分割分表。
    选择正确的存储引擎。

    12). 如何获取当前数据库版本

    使用 select version() 获取当前 MySQL 数据库版本。


    13). 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重
    启mysql 数据库,又插入了一条数据,此时 id 是几

    表类型如果是 InnoDB,那 id 就是 6。
    表类型如果是 MyISAM ,那 id 就是 8。

    14). 数据库的三范式是什么?

    第一范式:强调的是列的原子性,即数据库表的每一列都是不可分
    割的原子数据项。
    第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是
    指不能存在仅依赖主关键字一部分的属性。
    第三范式:任何非主属性不依赖于其它非主属性。

  • 相关阅读:
    Entity Framework 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭 异常处理
    MD5加密
    让AutoMapper在你的项目里飞一会儿
    C# SFTP上传与下载
    读取、修改配置文件节点
    C#对数据库的操作(增删改查)
    实现Icommand接口
    wpf创建用户控件(计时器控件)
    用lpeg解析文本语法
    一种简单的客户端更新方案
  • 原文地址:https://www.cnblogs.com/zzjlxy-225223/p/10849195.html
Copyright © 2011-2022 走看看