MySQL # MySQL相关面试题
Posted LRcoding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL # MySQL相关面试题相关的知识,希望对你有一定的参考价值。
参考 https://mp.weixin.qq.com/s/Yb6sPqQrZ2hs7DU-W–wWQ
1. 什么是存储过程?有哪些优缺点?
存储过程就像我们编程语言中的函数一样,封装了我们的代码(PLSQL、T-SQL)
优点:
- 能够将代码封装起来,保存在数据库之中,让编程语言进行调用
- 存储过程是一个预编译的代码块,执行效率比较高
- 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率
缺点:
- 每个数据库的存储过程语法几乎都不一样,十分难以维护(不通用)
- 业务逻辑放在数据库上,难以迭代
2. 三个范式是什么
第一范式:字段是最小的的单元不可再分
第二范式:满足第一范式,表中的字段必须完全依赖于全部主键而非部分主键。(消除部分函数依赖)
第三范式:满足第二范式,非主键外的所有字段必须互不依赖)(消除传递函数依赖)
3. 什么是视图?以及视图的使用场景有哪些?
视图是一种基于数据表的一种虚表
- 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表
- 向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为 存储起来的 SELECT 语句
- 视图没有存储真正的数据,真正的数据还是存储在基表中,操作的还是基表
- 一个基表可以有0个或多个视图
视图可以将查询出来的数据进行封装,让我们专注于 逻辑,但不提高查询效率
4. drop、delete与truncate分别在什么场景之下使用?
drop table
(不再需要一张表的时候)
- 1)属于DDL
- 2)不可回滚
- 3)不可带where
- 4)表内容和结构删除
- 5)删除速度快
truncate table
(保留表而删除所有数据的时候)
- 1)属于DDL
- 2)不可回滚
- 3)不可带where
- 4)表内容删除
- 5)删除速度快
delete from
(想删除部分数据行时候,带上where子句)
- 1)属于DML
- 2)可回滚
- 3)可带where
- 4)表结构在,表内容要看where执行的情况
- 5)删除速度慢,需要逐行删除
5. 索引是什么?有什么作用以及优缺点?
索引表把数据变成是有序的,快速定位到硬盘中的数据文件
- 是一种快速查询表中内容的机制,类似于新华字典的目录
- 运用在表中某个些字段上,但存储时,独立于表之外
一张表最多可以建16个索引
特点:
- 索引一旦建立,Oracle管理系统会对其进行自动维护, 而且由Oracle管理系统决定何时使用索引
- 用户不用在查询语句中指定使用哪个索引
- 在定义primary key或unique约束后系统 自动 在相应的列上创建索引
- 用户也能按自己的需求,对指定单个字段或多个字段,添加索引
- 可以加快检索速度,但是也降低了其他的速度,需要占用空间
【要】创建索引
- 表经常进行 SELECT 操作
- 表很大(记录超多),记录内容分布范围很广
- 列名经常在 WHERE 子句或连接条件中出现
【不要】创建索引
- 表经常进行 INSERT/UPDATE/DELETE 操作
- 表很小,不经常出现
分类:
- 唯一索引:唯一索引不允许两行具有相同的索引值
- 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
- 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
- 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个
6. rowid特点
- (1)位于每个表中,但表面上看不见, 例如:desc emp是看不见的
- (2)只有在select中,显示写出rowid,方可看见
- (3)它与每个表绑定在一起,表亡,该表的rowid亡,二张表rownum可以相同,但rowid必须是唯一的
- (4)rowid是18位大小写加数字混杂体,唯一表代该条记录在DBF文件中的位置
- (5)rowid可以参与=/like比较时,用’’单引号将rowid的值包起来,且区分大小写
- (6)rowid是联系表与DBF文件的桥梁
7. 事务
事务简单来说:一个Session中所进行所有的操作,要么同时成功,要么同时失败
ACID — 数据库事务正确执行的四个基本要素
- 包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
一个支持事务(Transaction)中的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易。
隔离级别
- Serializable【可避免脏读,不可重复读,虚读】
- Repeatable read【可避免脏读,不可重复读】
- Read committed【可避免脏读】
- Read uncommitted【级别最低,什么都避免不了】
分别对应Connection类中的4个常量
- TRANSACTION_READ_UNCOMMITTED
- TRANSACTION_READ_COMMITTED
- TRANSACTION_REPEATABLE_READ
- TRANSACTION_SERIALIZABLE
脏读:一个事务读取到另外一个事务未提交的数据
不可重复读:一个事务读取到另外一个事务已经提交的数据,也就是说一个事务可以看到其他事务所做的修改
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
8. 数据库的乐观锁和悲观锁是什么?
并发控制主要采用的技术手段,确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性
-
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
-
在查询完数据的时候就把事务锁起来,直到提交事务
-
实现方式:使用数据库中的锁机制
-
-
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
-
在修改数据的时候把事务锁起来,通过version的方式来进行锁定
-
实现方式:使用version版本或者时间戳
-
9. 超键、候选键、主键、外键分别是什么?
- 超键:在关系中能唯一标识元组的 属性集 称为关系模式的超键
- 一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。
- 超键包含候选键和主键。
- 候选键(候选码):是最小超键,即没有冗余元素的超键。
- 主键(主码):数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合
- 一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
- 外键:在一个表中存在的另一个表的主键称此表的外键。
例子:邮寄地址(城市名,街道名,邮政编码,单位名,收件人)
- 它有两个候选键:{城市名,街道名} 和 {街道名,邮政编码}
- 如果我选取{城市名,街道名}作为唯一标识实体的属性,那么{城市名,街道名} 就是主码(主键)
10. SQL 约束有哪几种?
-
NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
-
UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
-
PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
-
FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列
因为它必须是它指向的那个表中的值之一。
-
CHECK: 用于控制字段的值范围。
11. 数据库运行于哪种状态下可以防止数据的丢失?
在**archivelog mode(归档模式)**只要其归档日志文件不丢失,就可以有效地防止数据丢失。
12. mysql存储引擎
- Innodb引擎(修改要求比较高的事务处理),Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
- MyIASM引擎(查询要求比较高的表)不提供事务的支持,也不支持行级锁和外键。(原本Mysql的默认引擎)
- MEMORY引擎(数据库需要一个用于查询的临时表):所有的数据都在内存中,数据的处理速度快,但是安全性不高。
13. MyIASM和Innodb两种引擎所使用的索引的数据结构是什么?
都是B+树!
- MyIASM引擎:B+树的数据结构中存储的内容实际上是实际数据的地址值。
- 它的索引和实际数据是分开的
- 使用索引指向了实际数据。这种索引的模式被称为非聚集索引。
- Innodb引擎:数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。
14. 为什么MySQL数据库索引选择使用B+树?
14.1 二叉查找树
1、任意节点左子树不为空,则左子树的值均小于根节点的值;
2、任意节点右子树不为空,则右子树的值均大于于根节点的值;
3、任意节点的左右子树也分别是二叉查找树;
4、没有键值相等的节点;
一个二叉查找树是由n个节点随机构成,所以,对于某些情况,二叉查找树会退化成一个有n个节点的线性链
14.2 AVL树
AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树树高不超过1
14.3 红黑树
1、每个节点非红即黑;
2、根节点是黑的;
3、每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的;
4、如果一个节点是红的,那么它的两儿子都是黑的;
5、对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点;
6、每条路径都包含相同的黑节点
相同的节点情况下,AVL树的高度低于红黑树
Map和Set都是用红黑树实现的
14.4 B/B+树
B+树是应文件系统所需而产生的一种B树的变形树(文件的目录一级一级索引,只有最底层的叶子节点(文件)保存数据)非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中,这不就是文件系统文件的查找吗?
有3个文件夹a、b、c, a包含b,b包含c,一个文件yang.c,a、b、c就是索引(存储在非叶子节点), a、b、c只是要找到的yang.c的key,而实际的数据yang.c存储在叶子节点上。
B类树是平衡树,每个结点到叶子结点的高度都是相同,这也保证了每个查询是稳定的。
B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树
在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度
14.5 B+树
1、非叶子节点的子树指针与关键字个数相同;
2、非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1]]的子树.(B树是开区间,也就是说B树不允许关键字重复,B+树允许重复);
3、为所有叶子节点增加一个链指针;
4、所有关键字都在叶子节点出现(稠密索引). (且链表中的关键字恰好是有序的);
5、非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层;
6、更适合于文件系统
为什么说B+树比B树更适合数据库索引?
B树在提高了IO性能的同时并没有解决元素遍历的效率低下的问题
正是为了解决这个问题,B+树应用而生。
B+树只需要去遍历叶子节点就可以实现整棵树的遍历。
而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。
1、 B+树的磁盘读写代价更低:
- B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小
- 如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多
- 一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
2、B+树的查询效率更加稳定:
- 由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。
- 所以任何关键字的查找必须走一条从根结点到叶子结点的路。
- 所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可
B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫
所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。
15. varchar和char的区别
char是一种固定长度的类型,varchar是一种可变长度的类型
16. mysql有关权限的表都有哪几个
权限表存放在mysql数据库里,由mysql_install_db脚本初始化
- user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
- db权限表:记录各个帐号在各个数据库上的操作权限。
- table_priv权限表:记录数据表级的操作权限。
- columns_priv权限表:记录数据列级的操作权限。
- host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
17. 数据表损坏的修复方式有哪些?
使用 myisamchk 来修复,具体步骤:
- 1)修复前将mysql服务停止。
- 2)打开命令行方式,然后进入到mysql的/bin目录。
- 3)执行myisamchk –recover 数据库所在路径/*.MYI
使用repair table **(修复被破坏的表)或者 OPTIMIZE table(回收闲置的数据库空间)**命令来修复
18. MySQL中InnoDB引擎的行锁是通过加在什么上完成
InnoDB是基于索引来完成行锁
select * from tab_with_index where id = 1 for update
for update
可以根据条件来完成行锁锁定,并且 id 是有索引键的列
19. 数据库优化的思路
19.1 SQL优化:
①选择最有效率的表名顺序(从右到左的顺序处理FROM子句中的表名)
- 选择记录条数最少的表放在最后
- 被其他表所引用的表放在最后
②WHERE子句中的连接顺序(自右而左的顺序解析WHERE子句)
- 可以过滤掉最大数量记录的条件必须写在WHERE子句的之右
③SELECT子句中避免使用*号
④用TRUNCATE替代DELETE(删除表的全部记录,除了表结构才这样做)
⑤多使用内部函数提高SQL效率
例如使用mysql的concat()函数会比使用||来进行拼接快
⑥使用表或列的别名(表或列的名字太长时)
⑦多使用commit
⑧善用索引
当表的记录量非常大的时候,我们就可以使用索引
⑨SQL语句用大写
⑩避免在索引列上使用NOT
避免在索引列上使用计算
用 >=
替代 >
用IN替代OR ( sal = 100 or sal = 120 –> sal in (100, 120) )
总是使用索引的第一个列
19.2 数据库结构优化
- 1)范式优化: 比如消除冗余(节省空间。。)
- 2)反范式优化:比如适当加冗余等(减少join)
- 3)拆分表: 垂直拆分和水平拆
20. Oracle和Mysql的区别
Mysql中,一个用户下可以创建多个库
oracle中一个数据库实例可拥有多个用户,一个用户默认拥有一个表空间。
表空间是存储我们数据库表的地方,表空间内可以有多个文件。
可以使用索引**
⑨SQL语句用大写
⑩避免在索引列上使用NOT
避免在索引列上使用计算
用 >=
替代 >
用IN替代OR ( sal = 100 or sal = 120 –> sal in (100, 120) )
总是使用索引的第一个列
19.2 数据库结构优化
- 1)范式优化: 比如消除冗余(节省空间。。)
- 2)反范式优化:比如适当加冗余等(减少join)
- 3)拆分表: 垂直拆分和水平拆
20. Oracle和Mysql的区别
Mysql中,一个用户下可以创建多个库
oracle中一个数据库实例可拥有多个用户,一个用户默认拥有一个表空间。
表空间是存储我们数据库表的地方,表空间内可以有多个文件。
我们需要指定用户、表空间来存储我们所需要的数据!
以上是关于MySQL # MySQL相关面试题的主要内容,如果未能解决你的问题,请参考以下文章