失效链接处理 |
MySQL DBA互联网大厂面试宝典500题 PDF 下载
本站整理下载:
相关截图:
主要内容:
1、我创建了⼀个没有select权限的⽤户,执⾏select * from T where k=1,报错“select
command denied”,并没有报错“unknown column”,是不是可以说明是在打开表之后才判断
读取的列不存在?
答:这个是⼀个安全⽅⾯的考虑。你想想⼀个⽤户如果没有查看这个表的权限,你是会告诉他字
段不对还是没权限?如果告诉他字段不对,其实给的信息太多了,因为没权限的意思还包含了:
没权限知道字段是否存在。
2、wait_timeout 是客户端 ⾮交互式的连接时间,如果程序连接mysql SERVER,是交互连接,
关联的时间参数为interactive_timeout, 这两个时间参数需要尽量⼀致吗,⼀般设置多少合适?
query_cache_size 参数虽然不⽤了,我想确认下,关闭情况是 query_cache_size=0 要匹配参数
query_cache_type=off吗? 还是直接query_cache_size=0 即可?
答:第⼀个问题:是的,这两个尽量设置成相同。值的话取决于业务。如果你⾯对的是成熟的开
发(⽐如公司内部团队),可以设置⼩些,分钟级别就⾏。
第⼆个问题:这两个都可以,不过⽤query_cache_type会好些(代码判断路径更短) 。
3、⽂⾥遇到临时内存会跟随⻓连接的存在⽽存在,直到连接被销毁。想问的是,这部分临时内
存是由于什么产⽣?为什么不提前释放呢?mysql有⽤到内存池吗?
答:排序、变量这些会占⽤内存,如果要复⽤,以前释放反⽽影响性能,MySQL没法⾃⼰决
定,所以5.7之后提供了⽅法让客户端有命令来做;MySQL的内存池⼀般说的是查询缓存和引擎
⾥⾯的(⽐如InnoDB 的buffe pool), 跟线程内缓存不是⼀个概念。
4、⽂中join的例⼦,内表和外表 都有⾼区分度条件的情况下,先过滤出两表符合条件的记录,
再对这些记录做join,可不可以?感觉这样性能更⾼。
答:MySQL确实有你提到的这种算法,叫做index_merge. 不过我们这个case⾥⾯不会,由于实
现的原因,MySQL⾄今没有⽀持跨表index_merge。
5、末尾问题有个疑问。是在分析器⾥⾯检查的列是否存在。且⽂章中说到执⾏器会检查有没有
权限。那为什么⼀个没有查询权限的⽤户进⾏查询语句,提示的是"没有权限"⽽不是"列不存
在"。按照这个逻辑权限应该是在执⾏器做的,那这个"权限不存在"是哪个模块检查的?
答:查询的时候权限不存在是在执⾏前单独多的⼀次判断,是为了安全考虑。就是如果没有权
限,你连“字段不存在”这个信息都不应该暴露给客户端。
6、如果你⽤的是 MySQL 5.7 或更新版本,可以在每次执⾏⽐较⼤的操作, 请问⽐较⼤的操作的
判断维度是什么呢? 即怎么判断是⽐较⼤的操作?
答:其实就是类似于很多数据排序,或者⼀个操作复杂的存储过程。这个是可以在测试环境稳定
复现的。 如果语句都差不多,或者⽐较随机,或者可以⽤另外⼀种⽅法,⽐如⼀个连接执⾏了
N个语句以后做reset这个动作。
7、既然在链接阶段已经通过权限表获取了这个该连接所具有的权限,那么在执⾏阶段再检查⼀
次的意义何在?
答:执⾏器阶段会碰到需要再判断权限的情况,这时候读内存中事先存好的权限,⽽这个权限是
在连接器阶段算出来存进去的。
8、请教个业务操作表的场景,如果对⼀个业务数据表的操作既有查询(分⻚查询批处理),⼜
有更新,此场景下都是操作主库好呢?还是说查询⾛从库,更新操作⾛从库?您有没有好的建议
呢,如果遇到了此类业务场景您会怎么分析解决此困扰呢?
答:必须做语句分类,延迟敏感的⾛主库,不敏感的⾛从库。
|