MYSQL面试系列-01
24年中,由于又更新了几个证书,尤其是腾讯TDSQL-MYSQL的TCE证书,好像很有含金量的样子,放到平台上立马给我带来了几次面试机会,也借着这次的机会,又把MYSQL的一些基础知识温习了一下,通过这个系列,把我整理的MYSQL面试基础理论分享给大家,一共24个类型题,我通过这个系列给大家分享出来吧。
1.mysql有关权限的表都有哪几个
https://blog.csdn.net/shaochenshuo/article/details/105511102
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化
这些权限表分别有
user 、db、tables_priv、columns_priv、procs_priv、proxies_priv
1.1 user 表
user表保存了用户信息,及用户的全局权限(即对实例上所有库的权限)。见如下例子:
grant select,index on . to ‘test_chen’@‘172.172.230.212’ identified by ‘root’;该语句对’test_chen’@'172.172.230.212’用户赋予全局的 select和index权限
1.2 db 表
该表记录了赋予用户的 数据级别的权限,如下:
grant select,insert on express_account.* to ‘test_shao’@‘172.172.230.210’ identified by ‘root’;该语句赋予用户对express_account库下所有对象有select和insert权限
1.3 tables_priv 和 columns_pri
1.3 tables_priv和columns_priv
这两个表分别记录的赋予用户的表级别和列级别的权限,例子如下:
- 表级别赋权
grant select,update on express_account.mst_wh to ‘test_fei’@‘172.172.230.210’ identified by ‘root’; - 列级别赋权
GRANT SELECT (sys_no), INSERT (wh_no,wh_name) ON expreShao1987ss_account.mst_wh TO ‘test_shu’@‘172.172.230.210’ identified by ‘root’;
1.4 procs_priv 表
如果给用户赋予某个function或者procedure的相关权限,相关信息被保存在procs_priv表中。function和procedure相关权限有The ALTER ROUTINE, CREATE ROUTINE, EXECUTE, and GRANT OPTION,这些权限可以被加在 全局,数据库级别或者具体到每个程序上
2.MySQL的binlog有有几种录入格式?分别有什么区别?
有三种格式,statement,row和mixed(默认格式为 row)
statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。
row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。
mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。
3.为什么Mysql 默认隔离级别为 rr
https://yufushujuku.blog.csdn.net/article/details/109000532
MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog。RR能提供SQL语句的写可串行化,保证了绝大部分情况(不安全语句除外)的DB/DR一致。
mysql的RR+binlog的statement格式能解决幻读情况,主要运用了NKL
4.InnoDB多版本(MVCC)实现机制
https://blog.csdn.net/shaochenshuo/article/details/76137652
mvcc实现机制依赖Undo+版本链(txid+roll_pointer)+一致性读快照(不同隔离级别,行为不同)
select语句执行流程
一条语句发出要经过
客户端–连接器(负责管理连接,用户授权管理)-查询缓存(8.0之前有)-分析器(语法分析词法分析语义分析)-优化器(输出最终执行计划)-执行器(存储引擎层根据产生的执行计划执行)
update语句执行流程
https://www.bilibili.com/video/BV1L841187ME/?vd_source=98d4a1bb64fff3d3cace7ee54357de77
先看内存中是否有要修改的页,如果有,则直接修改,如果没有则从硬盘读取到内存中,然后进行更新操作。
更新操作首先要写UNDO,然后开始redo,再提交前进行binlog的写入,写入完成后redo进行commit;
在这个过程中任何的失败都会启动实例的时候执行恢复。使用UNDO前滚,未提交的事务执行UNDO回滚操作,达到事务的一致性。
.1.开启事务
·2.SQL解析、查询计划生成
·3.查询要修改的数据
·4.校验锁和加锁
·5.修改数据和生成日志
.6.本地提交
·7.主备复制
·8.返回提交成功
5.sql_slave_skip_counter 含义
https://blog.csdn.net/shaochenshuo/article/details/60964579
对于myisam引擎,N指跳过N个SQL语句;
对于innodb引擎,N指跳过N个event,在binlog上命令以event的形式存在,并非一个命令对应一个event。以一个insert语句为例(InnoDB引擎、binglog_format=statement), 在binlog中实际上有三个event,分别为begin\insert\commit,命令类型都是Query_log_event.
<1>set global sql_slave_skip_counter=N中的N是指跳过N个event。
<2>最好记的是N被设置为1时,效果跳过下一个事务。
<3>跳过第N个event后,位置若刚好落在一个事务内部,则会跳过这整个事务。
<4>一个insert/update/delete不一定只对应一个event,由引擎和日志格式决定。
- 关于 mysql AUTO_INCREMENT lock 你知道多少
https://blog.csdn.net/shaochenshuo/article/details/89709234
https://www.bilibili.com/video/BV1iL4112715/
6.1自增锁相关
当插入的表中有自增列时,为了保证生成的自增值是唯一的,要先为该表加AUTO_INC 表锁,AUTO_INC锁具有以下特点:
AUTO_INC 锁互不兼容,同一张表同时只允许有一个自增锁;
自增锁不遵循二段锁协议,不是事务结束时释放,而是在INSERT语句执行结束时释放
自增锁是为了做自增值的并发处理,会产生自增锁,是表级锁,innodb规定如果有自增约束,必须给自增主键添加索引
自增所持续时间:插入语句提交后,自增锁会释放。
注意事项:如果有大事务做批量插入,持续占用自增锁,会造成锁等待。
配置项 innodb_autoinc_lock_mode 的值0、1、2
模式0 传统模式,就是表锁模式
模式1 间断模式
Bulk inserts 不能确定插入数使用表锁;
Simple inserts 和Mixed-mode inserts使用轻量级锁mutex,只锁住预分配的自增值,而不锁整张表
优点是平衡了并发性,又能保证同一条INSERT语句分配的自增值是连续的。
模式2 穿插模式,所有的 INSERT 语句,都不会应用 AUTO-INC 自增锁,而是应用较为轻量的 mutex 锁。性能最好,但无法保证数据一致性。
如果你的 DB 有主从同步,并且 Binlog 存储格局为 Statement,那么不要将 InnoDB 自增锁模式设置为穿插模式,会有问题。造成主从主键数据不一致。
全部都用轻量级锁mutex,并发性能最高,按顺序依次分配自增值,不会预分配。
缺点是不能保证同一条INSERT语句内的自增值是连续的
6.2主键常用的方案有哪些?基于应用自增主键的优势是什么
主键类型有人经常用INT类型,有42亿的问题,高并发高性能容易达到最大值,而达到后,数据库报重复值错误,
使用BIGINT有回溯问题
使用UUID有不连续问题
使用uuid_2_bin函数实现连续,但同样由于自增锁的机制,会对数据库产生性能问题。
基于应用的自增主键,通过雪花算法实现,容易产生时间回拨问题,使用一些机制避免,单独构建自增键的集群,不需要数据库层面考虑性能影响。
基于应用的自增好处是不需要数据库的压力,性能有更好的优势,在大并发场景,
例如雪花算法,每ms可以4096个自增值。如果大于此值,则可以轮询其他节点。
7.Mysql 支持的数据类型
7.1 整数类型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示1字节、2字节、3字节、4字节、8字节整数。任何整数类型都可以加上UNSIGNED属性,表示数据是无符号的,即非负整数。
长度:整数类型可以被指定长度,例如:INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数,而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。
7.2 实数类型,包括FLOAT、DOUBLE、DECIMAL。
DECIMAL可以用于存储比BIGINT还大的整型,能存储精确的小数。
而FLOAT和DOUBLE是有取值范围的,并支持使用标准的浮点进行近似计算。
计算时FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串进行处理。
7.3 字符串类型,包括VARCHAR、CHAR、TEXT、BLOB
VARCHAR用于存储可变长字符串,它比定长类型更节省空间。
VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。
7.4 枚举类型(ENUM),把不重复的数据存储为一个预定义的集合。
有时可以使用ENUM代替常用的字符串类型。
ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。
ENUM在内部存储时,其实存的是整数。
尽量避免使用数字作为ENUM枚举的常量,因为容易混乱。
排序是按照内部存储的整数
7.5 日期和时间类型 timestamp, datetime, date, time, year等
timestamp 带时区信息,有效期到2038年
datetime效率高,一般用datetime类型即可。时区可以从前端界面上考虑
8.MySQL存储引擎MyISAM与InnoDB区别
1)前者不支持事务,后者支持,前者只支持表锁,后者支持行锁,前者不支持外键,后者支持
2)前者是堆表,后者是索引组织表
3)前者数据和索引分开存储(分别存储在 .MYD 和 .MYI 文件中,表结构存储在.frm 文件中)。后者数据和索引集中存储,要么在.ibd 文件中,要么在 ibdata 文件中。
mysql面试系列01 https://blog.csdn.net/king01299/article/details/142255938
mysql面试系列02 https://blog.csdn.net/king01299/article/details/142256074
mysql面试系列03 https://blog.csdn.net/king01299/article/details/142270921
mysql面试系列04 https://blog.csdn.net/king01299/article/details/142298485
mysql面试系列05 https://blog.csdn.net/king01299/article/details/142304246
由于整个系列内容还是挺多的,我看了一下50000字左右,所以建议大家直接去资源站免费下载,具体地址:
https://download.csdn.net/download/king01299/89752708
还请大家多好评,收藏,评论,关注,一键三连哦!!!