目录
- 前言
- 1.InnoDB和MyISAM的区别
- 2.数据库的索引是什么结构,为什么不用哈希表?
- 3.聚簇索引和非聚簇索引
- 4.索引怎么实现的B+树,为什么选这个数据结构?
- 5.MySql 的主从同步是如何实现的?
- 6.Mysql 什么时候会进行全局扫描
- 7.索引的优化
前言
最近又到了找实习热门时间,每天坚持更新Java
实习岗位相关的面试题,不仅是自己学习总结,也为了帮助大家一起准备,每天进步一点点,坚持不懈,水滴石穿,一起拿下offer
。
1.InnoDB和MyISAM的区别
InnoDB
是具有事务、回滚和崩溃修复能力的事务安全型引擎,它可以实现行级锁来保证高性能的大量数据中的并发操作;
MyISAM
是具有默认支持全文索引、压缩功能及较高查询性能的非事务性引擎。
InnoDB
是MySQL5.5之后的默认引擎, 行锁是通过给索引上加锁来实现的,只有通过索引条件检索数据,innoDB
才使用行锁,否则,使用表锁。
从以下四个角度对比:
- 1.事务:
InnoDB
支持事务,MyISAM
不支持 - 2.数据锁:
InnoDB
支持行级锁,MyISAM
支持表级锁 - 3.读写性能:
InnoDB
增删改性能更优,MyISAM
查询性能更优。 - 4.全文索引:
InnoDB
不支持(但可通过插件等方式支持);MyISAM
默认支持。 - 5.外键:
InnoDB
支持外键,MyISAM
不支持。
2.数据库的索引是什么结构,为什么不用哈希表?
Mysql
的索引由B+
树实现, 哈希表的查询效率的确最高,时间复杂度 ,但是它要求将所有数据载入内存,而数据库存储的数据量级可能会非常大,全部载入内存基本上是不可能实现的; B+
树可以分段加载需要的节点数据,可以在内存资源有限的前提下,极大提高查询效率。
3.聚簇索引和非聚簇索引
两者主要区别是数据和索引是否分离。聚簇索引是将数据与索引存储到一起,找到索引也就找到了数据;而非聚簇索引是将数据和索引存储分离开,索引树的叶子节点存储了数据行的地址。
聚簇索引:索引结果和数据一起存放的索引。 优点:聚簇索引的查询速度非常快,因为聚簇索引本身就是一个B+树,数据节点属于有序的,当定位到索引上的时候就相当于找到了数据。 缺点:更新的时候代价大,依赖有序的数据
非聚簇索引:索引结构和数据分开存放的索引。 优点:更新代价比聚簇索引小 缺点:依赖有序的数据,可能会二次回表查找
4.索引怎么实现的B+树,为什么选这个数据结构?
- 索引的本质就是通过预排序+树型结构来加快检索效率,而MySQL中使用InnoDB和MyISAM引擎时都使用了B+树实现索引。
- 在二叉查找树上查找一个数据时,当出现海量数据时,查找效率将大大折扣,B+树是一棵平衡多路查找树,可以有效减少磁盘IO,同时B+树增加了叶子结点之间的连接,能保证范围查找时找到起点和终点后能快速取出需要的数据。
5.MySql 的主从同步是如何实现的?
复制(replication)是MySQL数据库提供的一种高可用高性能的解决方案,一般用来建立大型的应用。总体来说,replication的工作原理分为以下3个步骤:
- 主服务器(master)把数据更改记录到二进制日志(binlog)中。
- 从服务器(slave)把主服务器的二进制日志复制到自己的中继日志(relay log)中。
- 从服务器重做中继日志中的日志,把更改应用到自己的数据库上,以达到数据的最终一致性。
6.Mysql 什么时候会进行全局扫描
全表扫描,就是一条一条记录的遍历,直到表中的最后一条记录。通常情况下,对没有建立索引的表查询都是全表扫描。
但是有时候表中即使有索引,如果使用不当,也会造成全表扫描。
- 1.条件中使用了
null
- 2.使用
or
作为连接条件 - 3.使用了
not in
或者in
- 4.使用模糊查询
- 5.使用了
!=
或者<>
时 - 6.使用
count(*)
时 - 7.使用参数作为条件时
7.索引的优化
为了优化索引,我们应该合理的创建索引,比如以下情况的列适合创建索引:
- 1.经常被查询的列
- 2.经常用于表连接的列
- 3.经常排序分组的列
以及创建索引时的四个不要:
- 1.选择性低的字段不创建索引(比如性别、状态等)
- 2.很少查询的列不要创建索引
- 3.大数据类型的字段不要创建索引
- 4.尽量不要使用
NULL
值