数据库面试题
面试题
- 什么时候使用索引查数据比全表扫描还更慢?
解答
- B+树和B树的区别?为什么MySQL要使用B+索引?为什么不用二叉树?
-
- B树又称平衡多路二叉树;
- 区别?-- B+树非叶子节点不保存数据,只在叶子节点保存数据;B树在叶子节点和非叶子节点都保存数据;从而导致如果使用B树,会增加磁盘IO次数,导致性能不如B+树;
- delete、truncate、drop之间的区别?
-
- 表和索引所占的空间。truncate之后table和index会所占用的空间会恢复到初始大小;delete不会减少table和index所占用的空间。
- 操作对象不同。truncate只能操作table;delete可以操作table和view。
- 效率。truncate>delete。
- delete是DML,会放到rollback segment日志中,事务提交才生效;truncate、drop是DDL,立即生效;
- 总结:如果想删除表,用drop;如果想删除部分数据,用delete;如果删除全部数据,但是保留表结构,用truncate;
- 什么是视图?view的使用场景是什么?
-
- 场景
-
-
- 只暴露几个字段;
- 查询的数据来自不同的分表,以联合的结果返回显示;
-
- 【索引面试题组】
-
- 索引的分类
-
-
- 普通索引
- 唯一性索引 --//索引值必须唯一,但允许有NULL值;create unique index idx on table_name(column(length))
- 主键索引 -- //一个表只能有一个主键索引,不允许有空值;
- 复合索引(又叫组合索引)--//遵循最左前缀匹配原则;
- 聚簇索引、非聚簇索引 --// 聚簇索引的顺序就是数据物理存储的顺序;
- 全文索引
- 哈希索引
-
http://www.cnblogs.com/luyucheng/p/6289714.html
-
- 索引的实现原理?
-
-
- B+树。-- B+树相对于B树的最大区别在于:B+树增加了叶子节点之间的连接。
-
-
- 使用索引效率一定高吗?什么场景使用索引?索引在什么场景下失效?MYSQL的索引支持?
-
-
- 索引缺点:索引虽然能大大提供查询速度,但同时会降低更新速度;
- 使用场景
-
-
-
-
- 经常被查询,很少被更新的字段;
- 范围查询、排序、分组等特性下;
-
-
-
-
- 失效场景
- MYSQL的索引支持?
-
-
-
-
- MYSQL主要提供索引:BTree索引、Hash索引、FullText索引、RTree索引
-
-
-
-
-
-
- 面试:索引的数据结构有哪些?
-
-
-
-
-
-
- 主要差别:
-
-
-
-
-
-
- B+树索引具有范围查找和前缀查找能力,查询复杂度为O(NlogN),相当于二分查找;
- Hash索引只能做等值查找,但是无论多大的Hash表,查找复杂度都是O(1);
- 在MYSQL中,只有HEAP/MEMORY引擎表才能显式支持哈希索引,InnoDB引擎的自适应哈希索引(adaptive hash index)不在此列,因为这不是创建索引时可指定的。
- 在大多数场景下,都会有范围查询、排序、分组等查询特征,用B+树索引就可以了。
-
-
-
-
- 为什么说B+树比B树更适合文件系统中的文件索引和数据库索引?
-
-
- //TODO https://blog.csdn.net/v_july_v/article/details/6530142
- B+树方便扫库。B+树直接遍历叶子节点就可以了,而B树需要中序遍历扫库。
- B树在提高了IO性能的同时并没有解决元素遍历效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。
-
-
- InnoDB和MyISAM的索引实现有什么区别?--https://www.cnblogs.com/zlcxbb/p/5757245.html
-
-
- 主索引的区别。InnoDB数据文件本身就是索引文件;而MyISAM数据文件和索引文件分开,data节点存放的是数据记录的地址。
- 辅助索引的区别。
-
-
- 复合索引有中间字段漏了,索引能用上吗?最左匹配原则是怎么实现的?
- MySQL索引的实现,innodb的索引,b+树索引是怎么实现的,为什么用b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。
- 什么是存储过程?存储过程有哪些优缺点?
- SQL优化有哪些方法?
https://blog.csdn.net/wuseyukui/article/details/71512793
- 如何优化一个慢查询?
- 说一说三个范式?
-
- 1NF 属性不可再分。
- 2NF 属性完全依赖于主键。[消除部分依赖]
- 3NF 属性不依赖于其他非主属性。[消除传递依赖]
- BCNF 在1NF上,任何非主属性不能对主键子集依赖[在3NF上消除对主码子集的依赖]
- 4NF 要求把同一表内的多对多关系删除。[消除多值依赖]
- 5NF [消除连接依赖]
- having和where的区别?
where是group by 之前的条件,having是where之后的条件。
- 【事务面试题组】
-
- 事务的特性和隔离级别有哪些?
-
-
- 原子性A
- 一致性C
- 隔离性I
- 持久性D
-
-
- Mysql实现事务的原理(MVCC)?
-
-
- InnoDB采用MVCC来支持高并发,并且实现了4个标准的隔离级别
-
-
- 脏读、幻读、不可重复读的区别?
SQL标准制定的隔离级别 | |||
| 隔离级别 | 隔离级别的值 | 会导致的问题 |
| | | \|/ | 读未提交 | 0 | 导致脏读 |
读已提交 | 1 | 避免脏读,允许不可重复读和幻读 | |
可重复读(默认) | 2 | 避免脏读和不可重复读,允许幻读; | |
串行化 | 3 | 事务串行执行,执行效率慢。 | |
注意: SQL标准下的RR是允许幻读的,但是InnoDB使用了间隙锁解决了幻读问题,保证事务的隔离级别,达到串行化的要求。 | |||
| |||
类型 | 理解 | 详解 | |
脏读 | 读到了未提交的数据 | 一个事务读取了另一个事务`未提交的数据`,而这个数据有可能被回滚。 | |
幻读 | 幻读强调的是新增、删除。同样的条件,两次查询的记录数不同。
强调的是:一个事务读到另一个事务已提交的 insert 数据。 | 不同事务独立执行时发生的一种现象。事务1读取指定Where条件的结果集,然后事务2插入一条新数据,而这条新数据刚好满足事务1所查询的条件,然后事务1再次查询时,看到了事务2新提交的数据。 | |
不可重复读 | 不可重复读强调的是修改。同样的条件,两次查询的记录值不同 | |
- MyISAM和InnoDB的主要区别和应用场景?
| InnoDB | MyISAM |
事务 | 支持 | 不支持 |
锁 | 行锁 (只有通过索引条件检索数据才使用行锁,否则使用表锁) | 表锁 |
外键 | 支持 | 不支持 |
MVCC多版本并发控制 | 支持 | 不支持 |
全文索引 | 不支持 | 支持 |
- 慢查询
- 乐观锁、悲观锁;mysql的乐观锁、悲观锁是怎么实现的?使用场景?
| 悲观锁 | 乐观锁 |
概念 |
| 适用多读的场景 |
实现方式 | 加锁(select...for update) |
|
使用场景 | Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 | java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。 |
缺点 |
|
|
|
- 【数据库的锁】
-
- 类型
-
-
- 表锁
- 行锁
- 页锁
- 乐观锁
- 悲观锁
- 共享锁
- 排他锁
- 意向锁
- 记录锁
- 间隙锁
-
https://www.cnblogs.com/paul8339/p/9936005.html
-
- 什么情况下使用表锁?InnoDB在什么时候使用表锁,什么时候又使用行锁呢?
-
-
- 在MySQL中,Innodb的行锁使用情况为:只有通过索引条件检索数据才使用行锁,否则使用表锁;
-
-
- 锁升级
- 什么样的场景会产生死锁?如何解决?
-
-
- MyISAM是不会产生死锁的,因为MyISAM要么获取整张表,要么不锁;
- 如何产生:在MySQL中,行级锁不是锁记录,而是锁索引。
-
-
-
-
- 当2个事务同时执行的时候,一个锁住了主键索引,等待其他相关索引。而另一个锁住了非主键索引,在等待主键索引,这个时候就会产生死锁。
- 在发生死锁之后,InnoDB一般会检测到,并使一个事务释放锁,并回退,另一个获取锁完成事务。
-
-
-
-
- 如何避免:
-
-
-
-
- 同一个事务中尽量做到获取所需的所有资源,减少死锁产生概率;
- 对于非常容易产生死锁的业务,可以考虑升级锁的粒度,通过表级锁来降低死锁的概率;
- 以固定的顺序访问表和行。交叉访问更容易造成事务等待回路。
- 降低隔离级别。如果业务允许(上面也分析了,某些业务并不能允许),将隔离级别调低也是较好的选择,比如将隔离级别从 RR 调整为 RC,可以避免掉很多因为 gap 锁造成的死锁。
- 为表添加合理的索引。防止没有索引出现表锁,出现死锁的概率会突增。
-
-
- 分库分表的原则?分库分表之后会带来什么问题?--见16.c
- MYSQL大表优化方案
-
- 单表优化:
-
-
- SQL调优加索引;
- 数据库参数调优;
- 升级硬件;
-
-
- 读写分离;
- 分库分表:垂直拆分、水平拆分。--优缺点?
- 表分区;
- 对于非结构化的数据,对事物要求不高,可以使用NOSQL;
- SQL注入原理?如何预防?
- 说一下MVCC机制?原理是什么?
- MySQL主从复制怎么实现的?具体原理是什么?有什么优缺点?如何解决主从同步延时问题?
-
- 原理:同步bin-log日志(记录了所有sql操作)
-
-
- 主:binlog输出线程
- 从:IO线程-去主库请求binlog,并将得到的binlog写到relay log(中继)日志文件中;
- 从:SQL线程-读取relay log日志读取、解析、执行,从而实现主从一致。
-
-
- 如何解决主从同步延时问题?
-
-
- 并行复制
-
-
- 做主从之后,主挂了怎么办?
-
-
- 半同步复制
-
- 什么时候使用索引查数据比全表扫描还更慢?
- 聚簇索引和非聚簇索引的区别?
-
- 聚簇索引
-
-
- 索引文件和数据文件在同一文件中。聚簇索引主要用在InnoDB引擎中。
-
-
- 非聚簇索引
-
-
- 非聚簇索引指的是B+树叶子节点上的data,并不是数据本身,而是数据存放的地址。主要用在MyISAM引擎中。
- 非聚簇索引比聚簇索引多一次数据IO。
-
参考链接