几条MySQL技术面试题

版权声明:seowen的Java小本子,欢迎转载! https://blog.csdn.net/weixin_42697074/article/details/88904066

17、表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问 
(1)、您是选择拆成子表,还是继续放一起; 
(2)、写出您这样选择的理由。 
答:拆带来的问题:连接消耗 + 存储拆分空间;不拆可能带来的问题:查询性能; 
如果能容忍拆分带来的空间问题,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区) 顺序IO,减少连接消耗,最后这是一个文本列再加上一个全文索引来尽量抵消连接消耗 
如果能容忍不拆分带来的查询性能损失的话:上面的方案在某个极致条件下肯定会出现问题,那么不拆就是最好的选择

18、MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的? 
答:InnoDB是基于索引来完成行锁

例: select * from tab_with_index where id = 1 for update;
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,
如果 id 不是索引键那么InnoDB将完成表锁,,并发将无从谈起

19、如何从mysqldump产生的全库备份中只恢复某一个库、某一张表?

答案见:http://suifu.blog.51cto.com/9167728/1830651

20、开放性问题:一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。 
1、如果A表TID是自增长,并且是连续的,B表的ID为索引

select * from a,b where a.tid = b.id and a.tid>500000 limit 200;

2、如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。

select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;

https://blog.csdn.net/ww646904527/article/details/77826025

猜你喜欢

转载自blog.csdn.net/weixin_42697074/article/details/88904066