MySQL数据库面试汇总_V1.1
2023-08-31 18:11:27 0 举报
AI智能生成
汇总MySQL面试问题
作者其他创作
大纲/内容
索引类别面试问题
请简述MySQL中的索引作用及其优缺点?
索引主要是大大提供MySQL对数据的检索速度
索引作用于Select...Where之后的查询条件
索引分为,单列索引和组合索引
缺点
索引虽然提高了检索速度,但会影响数据的插入、更新、删除速度
大量的索引会占用磁盘空间(索引文件)
MySQL一共有多少索引类型呢?
FULLTEXT(全文索引)
HASH(哈希索引)
BTREE(B+树)
RTREE(B-树)
MySQL中一共有索引种类有多少呢?
普通索引
唯一索引
列值唯一
索引字段值可以为 NULL
主键索引
列值唯一
索引字段值不能为 NULL
一张表只能存在一个主键索引
组合索引
多个字段组成一个索引
全文索引
对文本内容进行分词,进行检索
MySQL中聚集索引与非聚集索引的区别?
MyISAM表没有聚集索引
除了聚集索引,其他都是非聚集索引
InnoDB只存在一个聚集索引
如果存在主键,即主键是聚集索引
如果没有主键,则会把第一个非空唯一索引作为聚集索引
否则,就会隐式的定义rowId为聚集索引
MySQL中主索引与辅助索引的区别?
主索引
必须是唯一的
InnoDB的数据文件本身就是索引文件
MyISAM的索引和数据是分开的
辅助索引
可以重复
InnoDB的辅助索引data域存储相应记录主键的值而不是地址
MyISAM的辅助索引和主索引没有多大区别
MyISAM中主索引与辅助索引,从结构上来说没有任何区别
一张表可以使用多少列创建索引呢?
任何标准表最多可以创建16个索引列
什么是回表查询?
通过非聚集索引查询到对应的主键,再通过主键查询到对应的行记录,就叫做回表查询
什么是索引覆盖?
Select查询字段为Where查询条件中的索引字段,再不需要通过主键查询对应的行记录
什么是索引下推?
5.6版本前,没有索引下推
组合索引,查询的时候,根据第一索引条件查询到一个数据,第二个索引条件进行回表比较,这样会造成只是第一个字段比对完成之后就进行回表操作判断第二个字段,频繁回表,查询效率低下
5.6版本后,引入索引下推
组合索引,查询的时候,直接在索引判断比对所有索引字段的值是否匹配,如果全对,在选择回表操作
什么是索引合并?
如何去避免全表扫描?
1、使用null做为判断条件
2、左模糊查询 Like %XXX%
3、使用 or 做为连接条件
4、使用 in 时 (not in)
5、使用 != 或 <> 时,建议使用 <,<=,=,>,>=,between等
6、“=”左边进行函数、算术运算或其他表达式运算
7、使用count(*)时,建议改count(1)
8、使用参数做为查询条件时
9、使用手动创建的临时表
10、使用子查询
11、分组统计使用排序
什么是最左原则?
建立联合索引(a,b,c)=(a)+(a,b)+(a,c)+(a,b,c),如果查询条件存在a字段就会触发最左原则
请简述一下索引的底层实现原理和优化
MySQL的索引主要是有 B+Tree,Hash索引、全文索引
这边主要讲一下InnoDB引擎的B+Tree的索引,B+树又称多路平衡树;
B+树的源头是二叉树,二叉树演化到平衡二叉树,平衡二叉树演化到B树,B+树又是从B树的基础上改造而来
B+数据是从二叉树演化而来,但B+树的逻辑
所以B树与B+树的基本相同
简单的说一下B树与B+树的不同之处:
1、B+树的关键字与指针数量相同
2、B+树的子树指针P[i],子树的区间范围为K[i],K[i+1]
3、B+树的叶子节点,包含所有的关键字与数据
4、B+树的叶子节点是有序的
5、B+树的前后叶子节点用双向链表项链(双向链表主要是可以更好的支持范围查询)
索引的优化主要由以下几点:
1、满足最左前缀原则,根据情况需要,建立对应的联合索引
2、选择选择性高的索引值,及重复度低的索引值
3、永远使用一个与业务无关的自增字段作为主键
4、避免回表查询
5、可以增加索引覆盖
这边主要讲一下InnoDB引擎的B+Tree的索引,B+树又称多路平衡树;
B+树的源头是二叉树,二叉树演化到平衡二叉树,平衡二叉树演化到B树,B+树又是从B树的基础上改造而来
B+数据是从二叉树演化而来,但B+树的逻辑
所以B树与B+树的基本相同
简单的说一下B树与B+树的不同之处:
1、B+树的关键字与指针数量相同
2、B+树的子树指针P[i],子树的区间范围为K[i],K[i+1]
3、B+树的叶子节点,包含所有的关键字与数据
4、B+树的叶子节点是有序的
5、B+树的前后叶子节点用双向链表项链(双向链表主要是可以更好的支持范围查询)
索引的优化主要由以下几点:
1、满足最左前缀原则,根据情况需要,建立对应的联合索引
2、选择选择性高的索引值,及重复度低的索引值
3、永远使用一个与业务无关的自增字段作为主键
4、避免回表查询
5、可以增加索引覆盖
什么情况下设置了索引但无法使用呢?
1、最左前缀法则
2、不在索引列上做任何操作(计算,函数,类型转换),这会导致索引失效,搜索转向全表
3、字符串不加单引号索引失效(发生了隐式的类型转换)
4、Where条件中索引列范围查询,右侧的索引失效
5、使用不等于,开始全表扫描
6、Like 以通配符开头(‘%abc’)索引失效,会变成全表扫描
7、OR前后没有同时使用索引
MySQL相关的数据结构
二分法
1、对数据进行排序
2、找到数据集中间节点
3、查找条件 与 中间节点 进行比对, 等于直接返回,中间节点数据小于查找条件说明数据在排序列表的左边,大于则说明数据在排序列表的右边
二叉树(二叉搜索树)
特点
1、所有的非叶子节至多拥有两个儿子(left、right)
2、每个节点只存储一个关键字
3、非叶子节点左指针指向小于其关键字的子树,右指针指向大于其关键字的子树
优点
1、不需要因为改变B树,导致重新组建树状结构而浪费内存开销
2、优秀的B树结构,其效率无限趋近二分法效率(比如非叶子节点都是为子节点集合的中间值)
缺点
1、B树的结构,依赖于关键字的录入顺序,如果非叶子关键字不是趋近中间值,则会导致 左子树、右子树,导致查询效率低下
2、录入之后无法变更树状结构
不同树状名称区分
空树
只有一个根节点,且没有值
根树
只有一个根节点,且有值
左子树
所有节点都没有右子树,而且根节点关键字值最大
右子树
所有节点都没有左子树,而且根节点关键字值最小
正常树
既有左子树,又有右子树
特殊树状
完满二叉树
所有非叶子节点的度都是 2
完全二叉树
所有非叶子节点的度都是 2,并且必须是从左到右、从上到下的顺序
满二叉树
简单地说,就是所有叶子节点都在同一个层上,每一层都铺满了节点
完全二叉树与满二叉树的区别
图
简述
二叉树,又称二叉搜索树
特点:
1、所有的非叶子节至多拥有两个儿子(left、right)
2、每个节点只存储一个关键字
3、非叶子节点左指针指向小于其关键字的子树,右指针指向大于其关键字的子树
优点:
1、不需要因为改变B树,导致重新组建树状结构而浪费内存开销
2、优秀的B树结构,其效率无限趋近二分法效率(比如非叶子节点都是为子节点集合的中间值)
缺点:
1、B树的结构,依赖于关键字的录入顺序,如果非叶子关键字不是趋近中间值,则会导致 左子树、右子树,导致查询效率低下
2、录入之后无法变更树状结构
特点:
1、所有的非叶子节至多拥有两个儿子(left、right)
2、每个节点只存储一个关键字
3、非叶子节点左指针指向小于其关键字的子树,右指针指向大于其关键字的子树
优点:
1、不需要因为改变B树,导致重新组建树状结构而浪费内存开销
2、优秀的B树结构,其效率无限趋近二分法效率(比如非叶子节点都是为子节点集合的中间值)
缺点:
1、B树的结构,依赖于关键字的录入顺序,如果非叶子关键字不是趋近中间值,则会导致 左子树、右子树,导致查询效率低下
2、录入之后无法变更树状结构
平衡二叉树 <-- 二叉树
平衡二叉树的特点
可以是空树
非叶子节点最多拥有两个子节点
非叶子节值大于左边子节点、小于右边子节点
树的左右两边的层级数相差不会大于1
没有值相等重复的节点
平衡旋转方法
LR
LL
RR
RL
AVL树
二叉搜索树
自带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为 1
红黑树
特点
若一棵二叉查找树是红黑树,则它的任一子树必为红黑树
红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1
与 AVL 树相比,其通过牺牲查询效率来提升插入、删除效率
五个强制要求
节点是红色或者黑色
根节点是黑色
所有叶子都是黑色
每个红色结点的两个子结点都是黑色
(从每个叶子到根的所有路径上不能有两个连续的红色结点)
任意一节点到每个叶子节点的路径都包含数量相同的黑节点
B树(B-树、多路搜索树)
特点
1、任意非叶子节点最多只有M个儿子(M:代表层级)
2、根节点的儿子数量为[2,M],且M > 2
3、除根节点以外的非叶子节点的儿子数量为[M/2,M]
4、每个节点存放至少M/2-1(向上取整)和至多M-1个关键字(至少2关键字)
5、非叶子节点的关键字==指向儿子的指针数量-1
6、非叶子节点的关键字:K[1],K[2],….,K[M-1];且K[i] < K[i+1]([M],中括号内M为层级)
7、非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树
8、所有叶子节点都是位于同一层
特性
1、关键字集合分布在整棵树内
2、任何关键字只出现一次在一个节点内
3、搜索有可能在非叶子节点结束
4、其搜索性能等价于在关键字全集内做一次二分法
5、自动层次控制
图
简述
B-树,又称多路搜索树
特点:
1、任意非叶子节点最多只有M个儿子(M:代表层级)
2、根节点的儿子数量为[2,M],且M > 2
3、除根节点以外的非叶子节点的儿子数量为[M/2,M]
4、每个节点存放至少M/2-1(向上取整)和至多M-1个关键字(至少2关键字)
5、非叶子节点的关键字==指向儿子的指针数量-1
6、非叶子节点的关键字:K[1],K[2],….,K[M-1];且K[i] < K[i+1]([M],中括号内M为层级)
7、非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树
8、所有叶子节点都是位于同一层
特性:
1、关键字集合分布在整棵树内
2、任何关键字只出现一次在一个节点内
3、搜索有可能在非叶子节点结束
4、其搜索性能等价于在关键字全集内做一次二分法
5、自动层次控制
特点:
1、任意非叶子节点最多只有M个儿子(M:代表层级)
2、根节点的儿子数量为[2,M],且M > 2
3、除根节点以外的非叶子节点的儿子数量为[M/2,M]
4、每个节点存放至少M/2-1(向上取整)和至多M-1个关键字(至少2关键字)
5、非叶子节点的关键字==指向儿子的指针数量-1
6、非叶子节点的关键字:K[1],K[2],….,K[M-1];且K[i] < K[i+1]([M],中括号内M为层级)
7、非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树
8、所有叶子节点都是位于同一层
特性:
1、关键字集合分布在整棵树内
2、任何关键字只出现一次在一个节点内
3、搜索有可能在非叶子节点结束
4、其搜索性能等价于在关键字全集内做一次二分法
5、自动层次控制
B+树(多路搜索树)
特点
B+树特点基本与B-树相同,除了一下4点
1、非叶子节点关键字与指针数量相同
2、非叶子节点的子树指针P[i],指向关键字值属于(K[i],K[i+1])的子树(B-树是开区间)
3、所有叶子节点增加了一个链指针,当天叶子节点尾链接到下个叶子节点的头
4、所有的关键字都出现叶子节点,且链表有序的
5、只有叶子节点保存关键字和数据(key 和 value)
图
简述
B+树,又称多路搜索树
特点:
B+树特点基本与B-树相同,除了一下5点
1、非叶子节点关键字与指针数量相同
2、非叶子节点的自述指针P[i],指向关键字值属于(K[i],K[i+1])的子树(B-树是开区间)
3、所有叶子节点增加了一个链指针,当天叶子节点尾链接到下个叶子节点的头
4、所有的关键字都出现叶子节点,且链表有序的
5、只有叶子节点保存关键字和数据(key 和 value)
特性:
1、所有关键字都出现在叶子节点的链表中(稠密索引,对应MySQL中的主索引),且链表中的关键字是有序的
2、不可能在非叶子节点命中
3、非叶子节点相当于是叶子节点的的索引(稀疏索引,对应MySQL表中辅助索引),叶子节点相当于是存储数据的数据层(主键 和 行记录)
4、更加适合文件索引系统
特点:
B+树特点基本与B-树相同,除了一下5点
1、非叶子节点关键字与指针数量相同
2、非叶子节点的自述指针P[i],指向关键字值属于(K[i],K[i+1])的子树(B-树是开区间)
3、所有叶子节点增加了一个链指针,当天叶子节点尾链接到下个叶子节点的头
4、所有的关键字都出现叶子节点,且链表有序的
5、只有叶子节点保存关键字和数据(key 和 value)
特性:
1、所有关键字都出现在叶子节点的链表中(稠密索引,对应MySQL中的主索引),且链表中的关键字是有序的
2、不可能在非叶子节点命中
3、非叶子节点相当于是叶子节点的的索引(稀疏索引,对应MySQL表中辅助索引),叶子节点相当于是存储数据的数据层(主键 和 行记录)
4、更加适合文件索引系统
B*树
特点
是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针
图
B树(B-树)、B+树、B*树
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点; 所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
为什么选择B+树作为数据库索引结构?谈谈你的理解
B树与B+树的对比
B+树的磁盘读写代价更低
B+树的内部并没有指关键字具体信息的指针,因此其内部节点相对于B树更小一点,如果把所有内部节点的关键字存放在同一块Block中,那么Block能容纳的关键字数据了更多,一次性读入内存需要查找的关键子更多,相对IO读写次数就更小
B+树的查询效率更加稳定
B+数据所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
B+树更好支持范围查询
范围数据查询的时候,B树需要进行一次次的中序遍历,按顺序来扫,需要多次查询。B+数据叶子节点之间是双向链表关联,所以更好支持范围查询
另一种说法
B树提高了IO性能的同时并没有解决元素遍历的时候效率低下的问题,而B+数据更好的解决了范围查询的为问题。而且数据是基于范围查询非常频繁的,B树这样支持的效率太低。
B+树与跳表的对比
1、B+树一个节点可以存储很多关键字,而且单个节点大小可以与磁盘页对其,一次IO就能传输一个节点数据(跳表可能出现跨页的问题),大幅度减少IO次数
2、跳表的索引建立具有随机性,磁盘不能对链表进行预读,产生大量随机IO
3、B+树检索效率比跳表高,因为同等数据下,B+树的层级比跳表少的多
B+树是多叉平衡搜索树,扇出高,只需要3层左右就能存放2kw左右的数据,同样情况下跳表则需要24层左右,假设层高对应磁盘IO,那么B+树的读性能会比跳表要好,因此mysql选了B+树做索引
MySQL 增加用户操作语句
-- 使用mysql数据库
USE mysql
-- 创建用户
CREATE USER myuser IDENTIFIED BY 'mypass';
-- 查看用户
SELECT user, host, authentication_string FROM USER WHERE USER='myuser';
-- 修改用户密码
update user set authentication_string='' where user='myuser';
ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypass';
-- 删除用户
DROP USER myuser;
-- 查看权限
SHOW GRANTS FOR myuser;
-- 授予权限
-- grant all privileges on databasename.tablename to 'user'@'host' identified by 'password';
-- 授予myuser用户全局级全部权限:
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypass' WITH GRANT OPTION;
-- 授予myuser用户针对testdb数据库全部权限:
GRANT ALL PRIVILEGES ON testdb.* TO 'myuser'
-- 生效(刷新权限)
FLUSH PRIVILEGES;
-- 撤销权限
-- revoke privileges on databasename.tablename from 'username'@'host';
REVOKE ALL PRIVILEGES FROM myuser;
USE mysql
-- 创建用户
CREATE USER myuser IDENTIFIED BY 'mypass';
-- 查看用户
SELECT user, host, authentication_string FROM USER WHERE USER='myuser';
-- 修改用户密码
update user set authentication_string='' where user='myuser';
ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypass';
-- 删除用户
DROP USER myuser;
-- 查看权限
SHOW GRANTS FOR myuser;
-- 授予权限
-- grant all privileges on databasename.tablename to 'user'@'host' identified by 'password';
-- 授予myuser用户全局级全部权限:
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypass' WITH GRANT OPTION;
-- 授予myuser用户针对testdb数据库全部权限:
GRANT ALL PRIVILEGES ON testdb.* TO 'myuser'
-- 生效(刷新权限)
FLUSH PRIVILEGES;
-- 撤销权限
-- revoke privileges on databasename.tablename from 'username'@'host';
REVOKE ALL PRIVILEGES FROM myuser;
MySql常用操作命令语句
查看正在执行的SQL进程
方式一:链接数据库后执行,查看sql可能不完整;
show processlist;
方式二:链接数据库后执行,可以查看完整SQL;
select * from information_schema.processlist;
mysqldumpslow 慢日志分析工具
参数
s:是表示按照何种方式排序
c:访问次数
i:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
t:即为返回前面多少条数据
g:后边搭配一个正则匹配模式,大小写不敏感
命令
访问次数最多的20个sql语句
mysqldumpslow -s c -t 20 1d0a52e2683d-slow.log
返回记录集最多的20个sql
mysqldumpslow -s r -t 20 1d0a52e2683d-slow.log
得到按照时间排序的前10条里面含有做了连接的查询SQL
mysqldumpslow -s t -t 10 -g "left join" /data/mysql/mysql-slow.log /
MySQL事务面试问题
MySQL中ACID指的是什么?
A: 原子性
事务要么全部被执行,要么就全部不被执行
C: 一致性
事务的执行使得数据库从一种正确状态转换成另一种正确状态
I: 隔离性
在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务
引出MVCC:多版本并发控制机制
D: 持久性
事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存
简述一下MySQL中的事务隔离级别分别是什么?
读未提交(read uncommited)
在同一个事物中,可以读到事物未提交的数据
读已提交(read committed)
在同一个事物中,只能读到事物已提交的数据
可重复读(repeatable read)
在同一个事物中,只能读取到在开启事物之前提交完毕的数据
串行化(serializable)
任何操作通过加锁顺序实现,不会出现任何问题
请简述一下不同的事务隔离级别可能导致的问题?
读未提交(read uncommited)
脏读
指的数据当前事物查询数据时候,没有关注另外一个数据对数据的回滚操作,导致数据在错误的基础上操作
不可重复读
可能读到在事物中间,修改的数据(同一条记录,出现两个值)
幻读
幻读指的是,select ID from table where id > 1,第一次查询出来一条数据,下次查询出来2条数据
读已提交(read committed)
不可重复读
幻读
可重复读(repeatable read)
幻读
串行化(serializable)
MYSQL支持事务吗?
在缺少指定模式下,MySQL是 autocommit 模式的,所有的数据更新操作都会即使提交,所以在缺少指定模式下,MySQL是不支持事务的
如果MySQL表类型是(InnoDB、BDB),可以支持事务处理,使用 SET AUTOCOMMIT = 0 就可以使MySQL允许在非 autocommit 模式,在非 autocommit 模式下,必须使用commit来提交你的更改,或者用rollback来回滚你的操作
MySQL中的MVCC是什么?
MVCC,中文名称为 多版本并发控制
图解
为什么MVCC机制,无法解决幻读问题?
1、MVCC机制,只是针对行数据进行操作
2、幻读,指的是在查询数据的时候,第一次查询出现5条数据,第二次查询可能出现6、7、8、9条数据
2、幻读,指的是在查询数据的时候,第一次查询出现5条数据,第二次查询可能出现6、7、8、9条数据
锁面试问题
Mysql中有哪几种锁?
表级锁
开销小,加索快
不会出现死锁
锁定粒度大,发生锁冲突的概率最高
并发度最低
行级锁
开销大,加锁慢
会出现死锁
锁定粒度最小,发生锁冲突的概率最低
并发度最高
页级锁
开销和枷锁时间界于表锁和行锁之间
会出现死锁
锁定粒度界于表锁和行锁之间
并发度一般
锁的优化策略
1、减少锁持有时间
减小事务持有锁的时间可以将降低死锁风险和所冲突,提高系统并发度。例如,尽快提交事务或者尽可能将多个操作合并为一个事务
2、尽量使用行级锁
在使用锁时,尽量使用行级锁而不是表级锁。行级锁只会锁定需要修改或者读取的记录,而表级锁会锁定整个数据表,导致其他操作无法进行。
3、优化索引
通过设计合理的索引,可以加速常见的查询操作,降低锁的竞争和冲突。例如,根据业务需求选择单列索引或者多列联合索引,避免使用不必要的全文搜索索引等。
4、使用批量操作
在批量操作时,可以使用insert into … value(…),(…),(…)等语句来一次性插入多条记录,避免多次插入造成的频繁锁定和IO开销。
5、采用分布式锁
对于高并发的系统,可以考虑采用分布式锁来控制并发访问和数据修改。
6、调整事务隔离级别
可以通过调整事务隔离级别来控制锁的影响范围和粒度。例如,将隔离级别调整为 read committed(读已提交:读操作不会锁定数据,因此可以减少锁的竞争和冲突,提高系统并发度和性能)可以保证数据一致性的前提下降低锁的冲突和阻塞。
MySQL中IN和OR的区别
1、使用IN操作符可以将多个条件的值打包成一个小的子查询,传递给数据库管理系统(DBMS)进行处理,从而减少多次交互和查询的开销。
2、当使用IN操作符时,DBMS可以通过使用过合适的索引来快速定位和获取所需的数据,从而避免全表扫描和其他低效率的查询方式。
3、当使用OR操作符时,DBMS需要对每个字查询进行单独的查询,并将结果进行合并,这会增加额外的开销,尤其当子条件比较复杂或者数据量较大时。
MySQL中行锁分成几种呢?
1、记录锁(Record Lock)
记录锁事最基本的行锁,它用于锁定单个记录以方式其他事务对该记录的修改或删除。当一个事务获取了某一个记录锁时,其他事务就无法对该记录进行写操作,智能对该记录进行读操作。
1、执行SELECT语句,并且使用FOR UPDATE选项
SELECT * FROM user WHERE id = 1 FOR UPDATE;
2、执行UPDATE、DELETE或INSERT语句
UPDATE user SET name = ‘new_name’ WHERE id = 1;
3、提交事务并释放锁
COMMIT;
2、间隙锁(Gap Lock)
间隙锁用于保护数据范围而非单个记录。当使用范围查询或者where条件包括不连续的索引键时,MySQL会自动选择间隙锁来锁定这个范围内的所有记录之间的空隙,以防止其他事务在该范围内插入新的记录或者修改已有的记录。
1、设置user表中的age为单列索引
SELECT * FROM user WHERE age > 20 AND age < 30
2、执行以上查询的时候,因为where条件中包含不连续的索引键,MySQL会自动选择并产生间隙锁
3、临键锁(Next-Key Lock)
临键锁时针对索引键进行的锁定,它用于保护一个索引键和其对应的记录之间的空隙。当使用where条件包含连续的索引键时,MySQL会自动选择临键锁来锁定这个范围内的空隙和所有记录,以防止其他事务对该范围内的记录进行修改。
1、设置user表中的age为单列索引
SELECT * FROM user WHERE age < 30
2、执行以上查询的时候,因为where条件中包含连续的索引键,MySQL会自动选择并产生临键锁
4、共享锁(Shared Lock)
共享锁用于允许多个事务同时读取同一份数据而不互相干扰。在共享锁的情况下,其他事务只能获取共享锁,而无法获取独占锁。
1、执行SELECT语句,并且使用FOR SHARE选项
SELECT * FROM user WHERE id = 1 FOR SHARE;
2、在获取锁后进行读取操作;
SLEECT name FROM user WHERE id = 1;
3、提交事务并释放锁
5、独占锁(Exclusive Lock)
独占锁用于防止其他事务对当前记录或者范围进行读或写操作。在独占锁的情况下,其他事务都无法或者独占锁或共享锁,直到该事务释放锁。
1、执行SELECT语句,并且使用FOR UPDATE选项
SELECT * FROM user WHERE id = 1 FOR UPDATE;
2、执行UPDATE、DELETE或INSERT语句
UPDATE user SET name = ‘new_name’ WHERE id = 1;
3、提交事务并释放锁
COMMIT;
MySQL数据库引擎面试问题
MySQL中哪些不同的表类型?
BDB、HEAP、ISAM、MERGE、MyISAM、InnoDB、Gemeni 一共7种类型
MySQL不同引擎对比
简述在MySQL数据库中MyISAM与InnoDB的区别?
MyISAM
不支持事务,但是每次查询都是原子性的
支持表级锁
存储表的总行数
一个MyISAM表有三个文件:索引文件、表结构文件、数据文件
采用非聚集索引,索引文件的数据域存储指向数据文件的指针
辅助索引与主键索引基本一致,但是辅索引不用保证唯一性
InnoDb
支持ACID的事务,支持事务的四种隔离级别
支持行级锁及外键约束
支持写并发
不存储总行数
一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里面),也可能为多个(设置为独立表空间,表大小手 操作系统文件大小限制,一般为2G)手操作系统文件大小的限制;
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅助索引的数据域存储主键的值;
(因此从辅助索引查找数据,需要先通过辅助索引找到主键值,在访问主索引获取记录)
最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整
MyISAM表类型将在哪里存储,并且还提供其存储格式?
MyISAM表以三种文件格式存储
表结构文件: .frm
数据文件: MYD
索引文件: MYI
InnoDB 为什么使用B+树,而不是跳表呢?
1、B+树一个节点可以存储很多个关键字,单节点大小可以与磁盘页对齐,一次IO就能传输一个节点数据(但跳表可能出现跳页问题),大幅度减少IO次数
2、跳表的索引的建立具有随机性,磁盘不能对链表进行预读操作,会产生大量随机IO
3、同等数据量下,跳表的建立的索引层级比B+树多的多,所以检索效率低
MySQL优化相关面试问题
实践中如何优化MySQL
说说对SQL语句的优化有哪些方法?
1、where子句中:
Where表之间的链接必须写在其他where条件之前
那些可以过滤掉最大数量纪录的条件必须写在where子句的末尾,having最后
那些可以过滤掉最大数量纪录的条件必须写在where子句的末尾,having最后
2、用 exists 替代 in,用 not exists 替代 not in
3、避免在索引列上使用计算
4、避免在索引列上使用 is null 和 is not null
5、对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及 order by 涉及的列上建立索引
6、应尽量避免 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
7、应尽量避免在 where 子句中对字段进行表达式操作,否则将导致引擎放弃索引而进行全表扫描
MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
1、设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率
2、选择适合的表字段数据类型和存储影响,适当的添加索引
3、MySQL库做 主从读写分离
4、找规律分表,减少单表中的数据量提高查询速度
5、添加缓存机制,比如 memcached、redis等
6、不经常改动的页面,生成静态页面
7、书写高效率的SQL
如何去避免全表扫描?
1、使用null做为判断条件
2、左模糊查询 Like %XXX%
3、使用 or 做为连接条件
4、使用 in 时 (not in)
5、使用 != 或 <> 时,建议使用 <,<=,=,>,>=,between等
6、“=”左边进行函数、算术运算或其他表达式运算
7、使用count(*)时,建议改count(1)
8、使用参数做为查询条件时
9、使用手动创建的临时表
10、使用子查询
11、分组统计使用排序
MySQL属性相关面试问题
MySQL中的char和varchar有什么区别呢?
固定长度 & 可变长度
char: 固定长度,比如char(32),数据只有15字符,那么该字段也是默认占用了32的位置,剩余位置用空格填充
varchar: 可变长度,
存储大小
char: 1-255/0-255
varchar: 64k
空格处理
char: 检索时会去掉尾部空格(数据本身有空白符也会被去掉)
varchar: 不会对空格处理
是否记录字段长度
char: 否
varchar: 是。额外拿出空间记录字段数据长度(字符数)
MySQL中DateTime与Timestemp有什么区别呢?
占用大小
DateTime:占用8个字节
Timestemp:占用4个字节
时间范围
DataTime:1001 年到 9999 年的日期和时间,精度为秒
Timestemp:1970 年到 2038 年的日期和时间,精度为秒
时区
DateTime:和时区无关
Timestemp:和时区有关
MySQL中Blob和Text有什么区别呢?
存储方式
Blob:使用二进制保存数据
Text:使用字符保存数据
与其他类型不同
存储位置:当Blob与Text太大时,MySQL将数据存储在外部空间,通过地址方式关联数据
排序:MySQL只会使用部分数据进行排序(max_sort_length)
索引:MySQL只会使用部分数据进行索引
NOW()和CURRENT_DATE()有什么区别?
NOW(): 命令用于显示当前年份,月份,日期,小时,分钟和秒
CURRENT_DATE(): 命令用于显示当前年份,月份和日期
其他类别面试问题
myisamchk是用来做什么的?
它用来压缩MyISAM表,这减少了磁盘或内存使用
MyISAM Static和MyISAM Dynamic有什么区别?
MyISAM Static
所有字段有固定的宽度
受损情况下更容易恢复
MyISAM Dynamic
动态MyISAM表将具有像TEXT,BLOB等字段,以适应不同长度的数据类型
列对比运算符是什么?
在SELECT语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR或LIKE运算符
mysql_fetch_array和mysql_fetch_object的区别是什么?
mysql_fetch_array
将结果行作为关联数组或来自数据库的常规数组返
mysql_fetch_object
从数据库返回结果行作为对象
Mysql如何优化DISTINCT?
DISTINCT在所有列上转换为GROUP BY,并与ORDER BY子句结合使用
如果一个表有一列定义为TIMESTAMP,将发生什么?
每当行被更改时,时间戳字段将获取当前时间戳
列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?
它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用
怎样才能找出最后一次插入时分配了哪个自动增量?
LAST_INSERT_ID将返回由Auto_increment分配的最后一个值,并且不需要指定表名称
你怎么看到为表格定义的所有索引?
SHOW INDEX FROM <tablename>;
LIKE声明中的%和_是什么意思?
%对应于0个或更多字符,_只是LIKE语句中的一个字符。
如何在Unix和Mysql时间戳之间进行转换?
UNIX_TIMESTAMP: 是从MySQL时间戳转换为Unix时间戳的命令
FROM_UNIXTIME: 是从Unix时间戳转换为MySQL时间戳的命令
什么是非标准字符串类型?
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
什么是通用SQL函数?
CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。
FORMAT(X, D)- 格式化数字X到D有效数字。
CURRDATE(), CURRTIME()- 返回当前日期或时间。
NOW() – 将当前日期和时间作为一个值返回。
MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从日期值中提取给定数据。
HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。
DATEDIFF(A,B) – 确定两个日期之间的差异,通常用于计算年龄
SUBTIMES(A,B) – 确定两次之间的差异。
FROMDAYS(INT) – 将整数天数转换为日期值。
mysql里记录货币用什么字段类型好
DECIMAL(9,2)
mysql有关权限的表都有哪几个?
user
db
table_priv
columns_priv
host
列的字符串类型可以是什么?
SET
BLOB
ENUM
CHAR
TEXT
0 条评论
下一页