您好,欢迎来到暴趣科技网。
搜索
您的当前位置:首页数据库常见面试题

数据库常见面试题

来源:暴趣科技网

1.sql的执行顺序

from>where>group  by>having>select>distinct>order by>limit

2.mysql的存储引擎

存储引擎有MyISAMInnoDB  mysql的默认引擎是InnoDB

两者的区别:

InnoDB是事务性的存储引擎、MyISAM是非事务的

MyISAM表锁;InnoDB有表锁、行锁

  • 行锁:sql条件中命中索引的就是行锁(死锁、锁冲突几率低、并发高)
  • 表锁:行锁失效,就自动升级为表锁(不易死锁、锁冲突几率高、并发低)

 表锁有2种模式:

  • 共享读锁:一个线程获得锁之后,其他线程对同一表能进行读操作
  • 独占写锁:会阻塞其他线程对同一表的写操作

3.#{}与${}的区别

4.为什么使用B+树作为mysql的索引数据结构?

mysql数据存储在硬盘中,不能一次性把数据加载到内存中

(1)B+树,只有叶子节点存储数据,基于这种特性,数据的查询不需要跨层遍历。比如:

select * from user where id>=10;

只需要找到id=10的节点,遍历链表,就可以找到往后的记录

(2)树的高度低,检索速度越快

这里提一下B树和B+树的区别

(3)B+树叶子节点有双向链表,便于遍历数据

B树是Node节点存储数据;B+树是叶子节点存储数据

5.数据库优化 

  1. 加索引,如果数据量特别大的话,索引也是无效的,可以在查数据库之前加一层缓存
  2. 表结构的优化:选择合适的数据类型和范式优化
  3. sql语句的优化:
  • ①不用*,而是列出所有列
  • ②减少表的连接
  • ③用in代替or
  • ④避免在where子句中写!=或<>、null判断
  • ⑤避免=前边有表达式或函数
  • ⑥避免使用模糊查询xxx%

提到索引,那么想来说说最左匹配原则,知道这个,有利于我们对sql进行优化。

6.最左匹配原则

假设联合索引(a,b,c)

范围条件:in、between…and…、>=、<=、!=

①当条件中某个参数是范围查询,那么该参数后的索引就不走了

比如:where a=1 and b<=3 and c=4

此时,索引只走a、b

②当条件中索引顺序变了,此时要分2种情况

(1)abc都是非范围查询,此时依旧走索引(mysql查询优化器会自动优化where条件顺序)

(2)当遇到范围查询,整个条件中的所有字段不走索引

③当遇到函数、表达式时,此字段及以后的都就不走索引

比如:where FORMAT(a,'yyyy-MM-dd')='2021-07-23' and b=1 and c=0

此时,都不走索引。

但是有时候可以优化为表达式或者函数在=后边

比如:a/3=9 可以优化为a=27

where b=1 and c=0 and FORMAT(a,'yyyy-MM-dd')='2021-07-23'

把a放在后边,在都是非范围的条件下,bc走索引。

④条件中只有bc 此时不走索引

7.mysql事物

  • 原子性:要么都执行成功、要么都执行失败(undo  log日志记录修改前信息)
  • 持久性:事物一旦提交、改变是永久的,(redo  log记录某个页上进行了什么修改)
  • 隔离性:并发事物之间是相互隔离的(隔离级别:读未提交、读已提交、可重复读、串行化)
  • 一致性:事务的执行保证数据库从一个一致的状态转变为另一个一致的状态

一致性是事物的目的,原子性、隔离性、持久性是实现一致性的手段

  1. 脏读:一个事物读取了另外一个事物的没提交的数据
  2. 幻读:针对 insert、delete 相同条件下,2次读取的结果条数不一致
  3. 不可重复读:针对update,一个事物对于同一数据,2次读取结果不一致

事务的隔离级别:读未提交 、读已提交、可重复读、序列化

  • 在读未提交的情况下,读不加锁,写加锁,就会引发脏读,mysql InnoDB采用MVCC多版本并发控制解决了这个问题
  • MVCC是通过生成数据快照,只在读已提交和可重复生效。read commit是语句级快照;repeatable read是事务级的快照
  • 读已提交解决了脏读,是在读取的时候生产“版本号”,等其他事务commit后,读取最新的版本号数据,否则读取旧版本数据
  • 可重复读隔离级别存在“幻读”问题,mysql的默认隔离级别是可重复读,在InnoDB引擎快照读MVCC解决了幻读问题,因为它是读历史版本的数据

8.回表

介绍回表前,要先了解聚簇索引和非聚簇索引

  1. 聚簇索引:存储主键和当前行数据
  2. 非聚簇索引:存储主键和索引

举个例子,user表的主键id,索引是name,其他列是age。此时非聚簇索引文件中存储的id,name

如果我们要查询age,条件是name:那么需要先根据name查询出主键id,再到聚簇索引文件中找age

这个过程叫做回表!

回表是指使用查询数据时非聚簇索引,想要的结果可能包含其他列(比如:orderName)但是只能查出来主键和索引(id和orderId)这个时候会根据主键再去查询其他列(orderName)

避免回表:建立联合索引,使得想要的列在索引中……

9.主从库

主从库实现读写分离,主库接收写请求,从库接收读请求,从库数据由主库发送binlog进行更新。

10.分库分表

单个数据库分成多个数据库,数据分散的分部到多个数据库

单个表分成多个表,数据分散到多个表

11.SQL执行计划

explain关键字   用于查看慢sql的原因

EXPLAIN
SELECT id from hr_staff_info where member_name='XXX';

其中有几个关键字段:

type(连接类型):

  1. all(全表扫描) 
  2. index 
  3. range(范围扫描) 
  4. ref(查找条件列使用了索引而且不为主键和unique) 
  5. ref_eq(使用了主键或者唯一键查询)
  6. const (使用主键查询)

possible_keys:可能用到的索引

key:实际用到的索引

rows:扫描的行数,越少越好;比如表有10w数据,扫描了10w就是全表扫描了

12.索引包括哪些?

索引包括:普通索引、唯一索引、主键索引、联合索引

导致索引失效的几种情况:

  • 遇到null值
  • 模糊查询 xxx%
  • 使用or
  • 最左匹配原则
  • where 1=1
  • =前边有表达式或函数
  • 使用!=
  • 类型隐式转化,比如a是varchar类型,sql中写a=1这样

13.mybatis分页是如何实现的?

通过page对象作为分页依据

通过count作为查询总条数

对原有sql通过limit进行分页

14.like %和like _的区别

%代表任意多个字符;_代表任意一个字符。

15.什么是存储过程?有哪些优缺点?

存储过程相当于编程语言中的函数,封装了我们的代码

存储过程的优点:

  • 封装代码
  • 保存在数据库中
  • 让编程语言调用
  • 存储过程是预编译代码块,执行效率高
  • 存储过程代替大量的sql语句,降低网络通信量,提高通信效率

存储过程的缺点:

  • 每个数据库的存储过程语法不一样,不通用
  • 业务逻辑放在数据库上,难易迭代
16.数据库范式你了解哪些?

第一范式:属性的原子性,列不可再分。(第一范式是所有关系型数据库的基础,不满足第一范式的数据库就不是关系型数据库)

第二范式:每个属性都必须完全依赖全部主键,不允许部分依赖

第三范式:每个非主属性都不传递依赖于R的候选码,不允许传递依赖

BC范式:每个属性都不传递依赖于R的候选码

17.什么是视图,视图的使用场景有哪些?

视图是一种虚拟的表,可以对数据库进行增、改、查操作。视图中可以包括一个表或多个表的行与列,对视图的操作不影响基本表,它使得我们获取数据更容易。

应用场景:

  1. 不希望访问者获取整个表的信息,只是暴露部分字段给访问者,所以创建一个虚表
  2. 查询数据来源于不同表,查询者希望以统一的方式查询,建立视图可以多表查询,效率也高
18. drop、delete、truncate的区别?

drop是删除表内容及结构、不可回滚、不可带where、删除速度快

delete是删除表中指定行数据、可回滚、可带where、删除速度慢

truncate是删除表中的内容,表结构还保留、不可回滚、不带where、删除速度快

19.触发器的作用?

触发器是与表相关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

触发器的这种特性可以协助应用在数据库端确保数据库的完整性

20.varchar和char的区别?

varchar和char都是数据库中用于描述字符串的类型

char是定长的;varchar是不定长的。

比如定义一个char[10]和一个varchar[10],如果存进去的都是‘test’,那么char还是占用10个长度,而varchar就会占用4个长度。所有char适合用于存放定长的字段,varchar适合用于存放不定长的字段。

char的存取速度比varchar要快

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoquwan.com 版权所有 湘ICP备2024080961号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务