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。
评论