mysql面试题

  1、为何用自增列做为主键

  
  一、若是咱们定义了主键(PRIMARY KEY),那么InnoDB会选择主键做为汇集索引。
  
  若是没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的惟一索引做为主键索引。
  
  若是也没有这样的惟一索引,则InnoDB会选择内置6字节长的ROWID做为隐含的汇集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
  
  二、若是表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置(主键插入性能最高,由于是顺序的),当一页写满,就会自动开辟一个新的页
  
  三、若是使用非自增主键(若是身份证号或学号等),因为每次插入主键的值近似于随机,所以每次新纪录都要被插到现有索引页得中间某个位置
  
  此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增长了不少开销,同时频繁的移动、分页操做形成了大量的碎片,获得了不够紧凑的索引结构,后续不得不经过OPTIMIZE TABLE来重建表并优化填充页面。
  mysql

  2、为何在字段上添加索引能提升查询效率

  
  一、添加索引的字段的值,是存放在索引构建的b+tree的叶子节点上,并通过排序存放;
  
  二、若有相关查询进来,会经过索引建立的b+tree获取数据所在的数据页(b+tree与二分查找法配合,只需几回io消耗就能够找到对应的数据页);
  
  三、找到数据页后,将页加载到buffer pool中,再内存中从数据页中获取具体数据;
  算法

  3、B+树索引和哈希索引的区别

  
  B+树是一个平衡的多叉树结构,从根节点到每一个叶子节点的高度差值不超过1,并且同层级的节点间有指针相互连接,是有序的,以下图:sql

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=
  哈希索引就是采用必定的哈希算法,把键值换算成新的哈希值,检索时不须要相似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法便可,是无序的,以下图所示:
  数据库

  4、哈希索引的优点:

  
  等值查询,哈希索引具备绝对优点(前提是:没有大量重复键值,若是大量重复键值时,哈希索引的效率很低,由于存在所谓的哈希碰撞问题。);MySQL中在缓冲池中会开启自适应哈希索引。
  缓存

  5、说说你对MySQL汇集索引的理解

  
  一、汇集索引的选择:
  
  会优先选择显示建立的主键做为汇集索引;
  
  若是没有则选择第一个建立的非空惟一索引做为汇集索引;
  
  如都没有则系统会建立一个实例级别的rowid做为汇集索引。
  
  二、汇集索引的特色:
  
  汇集索引的键值顺序决定了表数据行的物理顺序;
  
  叶子节点上存放的是整行数据;
  
  一张表只能建立一个汇集索引。
  架构

  6、说说MySQL如何优化普通索引的写操做

  
  如一个普通索引的插入操做,对于非汇集索引叶子节点的插入再也不是顺序的了,这时就须要离散地访问非汇集索引页,因为随机读取的存在而致使了插入操做性能降低。
  
  MySQL经过insert buffer(插入缓冲)这个特性,来优化普通索引的写入操做。
  
  对于非汇集索引的插入操做,不是每一次直接插入到索引页中,而是先判断插入的非汇集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个Insert Buffer对象中。而后再以必定的频率和状况进行Insert Buffer和辅助索引页子节点的merge(合并)操做,这时一般能将多个插入合并到一个操做中(由于在一个索引页中),这就大大提升了对于非汇集索引插入的性能。
  并发

  7、说说前缀索引使用的注意事项

  
  建前缀索引时,最重要的是定义好长度,把握好度,便可节省内存使用,又能够减小额外的查询成本;前缀索引会对覆盖索引产生影响
  ide

  8、说说索引影响着哪些方面

  
  索引关乎着MySQL性能,影响着方方面面;
  
  最主要的有这几点:提高读性能;减小锁等待和死锁;主从复制中sql线程利用索引进行回放,减小主从延迟。
  函数

  9、什么状况下应不建或少建索引

  
  首先你们要知道索引的用处:索引就是用来从大量数据中获取少部分数据
  
  一、常常更新的字段
  
  二、重复值比较高的字段
  
  三、不常常查询的字段
  
  四、若是表中记录数特别特别少,就不建议在表中字段上建立索引;可是若是达到万级别以上,仍是建议建立索引
  性能

  10、如何限制某ip段下的某个ip用户不容许登陆

  
  利用用户ip精确匹配的特色;假如原先用户ergou@'192.168.58.%',从新建立一个用户,如ergou@'192.168.58.51',并从新设置密码;这样就会用户经过用户ergou登陆,就会匹配到ergou@'192.168.58.51'。
  

  11、delete与truncate区别

  
  一、delete是逻辑删除,按行删除数据,效率低,支持回滚;可是你们要知道delete只是作了一个删除的标记,具体的删除是由purge线程完成删除,这才会释放空间
  
  2.truncate是物理删除,释放空间,速度快,不支持回滚
  

  12、生产中为何建议字段使用not null约束

  
  一、从性能来讲,空值会存放在b+tree的左边,形成索引性能降低
  
  二、空值须要更多的存储空间,多1个字节(null列上创建索引后)
  
  三、形成统计结果的不许确,count(*)会统计容许为null的字段,count(某字段)不含null值
  

  十3、什么状况下使用不到索引

  
  一、where条件:
  
  ​ 列进行计算:
  
  ​ explain select * from orders where o_custkey=o_custkey+1;
  
  ​ 列使用函数:
  
  ​ explain select * from orders where o_custkey=ceil(o_custkey);
  
  ​ 列进行隐式转换:
  
  ​ explain select * from emp where ename=007;
  
  二、联合索引:用到范围查询,只能用到部分索引
  
  三、联表查询:
  
  ​ 关联条件字符集不一样,不走索引
  
  ​ 关联条件的列类型不一样,不走索引
  
  四、其余状况:
  
  ​ 。select * from emp;
  
  ​ 。查询结果集大于数据量的30%,不走索引
  
  ​ explain select * from emp where empno > 7000;
  
  ​ 。索引自己失效
  
  ​ 。like '%s'
  
  ​ explain select * from emp where ename like '%s';
  
  ​ 。not in(111,9999) 普通索引,若是是主键索引,会被优化为范围查询,能够利用索引
  
  ​ explain select * from emp where empno not in(111, 9999);
  
  ​ 。!=
  
  ​ explain select * from emp where empno != 9999;
  

  十6、四种隔离级别

  
  读未提交(read-uncommitted)RU,产生脏读
  
  ​ 读已提交(read-committed)RC,不会产生脏读,产生不可重复读;
  
  ​ 可重复读(repeatable-read)RR,不会产生脏读,不会产生不可重复读;会产生幻读(可是innodb默认会阻止产生幻读,经过锁实现);
  
  ​ 可串行化(serializeable),不会产生脏读,不会产生不可重复读;不会产生幻读;完美符合事务,但性能最低
  

  十7、MVVC

  
  MySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) 
  
  MVCC最大的好处:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是很是重要的,极大的增长了系统的并发性能,现阶段几乎全部的RDBMS,都支持了MVCC。
  
  MVCC由数据页中的事务id、回滚指针+undo日志,read view构成
  

  十8、事务两阶段提交

  
  阶段1:写redo log,事务处于prepare
  
  阶段2:写binlog,事务处于commit
  
  写binlog成功有xid事件,会将xid写入redo log
  

  十9、binlog与redo log区别

    ①redo log是innodb存储引擎独有的,binlog是不区分存储引擎    ②记录内容不一样,redo log是物理逻辑日志,记录页的变化过程;binlog是逻辑日志,记录事务具体操做的内容    ③写入时间不一样,先写入redo log,再写入binlog    ④redo log是循环使用文件,binlog每次新增一个文件    二10、如何快速将一张大表迁移到其余数据库实例    二11、事务是如何实现的    二12、MySQL在RR隔离级别下如何阻止幻读    二十3、生产如何尽可能避免死锁    二十4、不一样隔离级别下、不一样索引下innodb行锁的粒度是什么样的    二十5、mysqldump备份原理    二十6、innodb存储引擎行锁冲突问题    二十7、MySQL在备份时,怎么作到一致性备份    二十8、主从复制原理    二十9、主从复制架构的瓶颈    三10、如何减小主从复制延迟    三11、过滤复制会产生哪些问题    三12、主从复制中断如何处理    三十3、1062或者1032错误,如何解决    三十4、如何将数据库回档到任意的一天    三十5、说说5.7和8.0在主从复制方面的改进    三十6、DML变慢的缘由

相关文章
相关标签/搜索