mysql面试题

目录

1.影响数据库性能的因素你认为有哪些(你觉得优化数据库有哪些方法)?

2.MyISAM和InnoDB存储引擎有什么本质区别?

3.MySQL客户端和服务端的通信方式是什么?

4.MySQL的查询缓存是什么?为什么MySQL默认关闭了查询缓存?那你觉得在什么场景下使用查询缓存比较好?

5.我们如何查看SQL语句的执行情况(什么是执行计划)?

6.如何定位慢查询?

7.Mysql中有哪些索引类型?

8.InnoDB的底层数据结构是什么?那请你介绍下什么是B+树?

9.B+Tree的优势是什么?

10.什么是聚簇索引(主键索引)和非聚簇索引(二级索引)?

11.什么是联合索引(复合索引)?

12.联合索引的匹配原则是什么?

13.索引是不是越多越好?

14.什么是覆盖索引?

15.创建联合索引要考虑哪些因素?

16.为什么不建议使用select * from 来查找数据?

17.我们在查询记录数量的时候,是使用count(*)还是使用count(id)?为什么?

18. 索引失效情况

19.sql优化

20.约束和索引有什么区别

21.mysql复合索引abc

22.Mysql 原子性实现原理

23.Undo Log的作用


1.影响数据库性能的因素你认为有哪些(你觉得优化数据库有哪些方法)?

1.服务器硬件:cpu、内存、磁盘读写效率、网卡流量

2.服务器的操作系统:Linux的配置参数不同性能不同

3.数据库存储引擎的选择:根据需要选择不同的存储引擎

4.数据库自身配置参数:MySQL有上百项的数据库配置参数;(my.cnf my.ini)

5.数据库表结构的设计和SQL语句的执行效率(影响最大的):慢查询是性能问题的罪魁祸首,不合理的数据库表结构设计和不合理的索引是影响数据库查询性能的重要因素;

6.数据库架构:高并发下读写分离、分库分表、多级缓存、搜索引擎;

2.MyISAM和InnoDB存储引擎有什么本质区别?

MyISAM不支持事务,表级锁,数据和索引分开存储。

InnoDB支持事务,支持行级锁,聚促索引(主键索引)方式存储。

3.MySQL客户端和服务端的通信方式是什么?

MySQL客户端与服务端的通信方式是“半双工”通信,在任何一个时刻,要么是客户端向服务端发送数据,要么是服务器向客户端发送数据,这两个动作不能同时发生。

4.MySQL的查询缓存是什么?为什么MySQL默认关闭了查询缓存?那你觉得在什么场景下使用查询缓存比较好?

1.MySQL的查询缓存是默认关闭的,我们可以修改配置文件来开启,开启后,可以缓存SELECT语句的查询结果集,当我们再次执行相同SQL语句的时候,会先到缓存中去查找,如果缓存中存在就直接返回。

2.如果是一个多写的应用,需要经常让缓存失效,浪费计算资源;查询需要将结果存入查询缓存,也会带来额外的系统消耗

3.以读为主的业务,数据生成之后就不常改变的业务场景下使用比较好,比如新闻类、字典表数据、报表数据等。

5.我们如何查看SQL语句的执行情况(什么是执行计划)?

Mysql提供了explain关键字来查看SQL的执行情况。我们通过执行计划提供的一些信息来对SQL进行分析,从而可以进行SQL优化。比如提供执行计划的访问类型就是重要的指标,它提供了8种类型级别,级别从好到坏。级别越高扫描表的次数就越高。

6.如何定位慢查询?

定位慢查询主要有如下几种方式:

1、业务驱动,主要是业务及运营人员或者用户反馈给我们的,他们在使用系统的过程中发现某些功能很慢,这种方式一般是项目上线后出现的,开发人员会比较被动,建议不要采用这种方式

2、测试驱动,系统上线前通过测试人员的反馈,了解到哪些功能比较慢

3、慢查询日志,通过开启MySQL慢查询日志监控慢查询sql并及时进行优化

4、实时获取,实时获取存在性能问题的SQL

7.Mysql中有哪些索引类型?

普通索引唯一索引,主键索引,全文索引,空间索引

8.InnoDB的底层数据结构是什么?那请你介绍下什么是B+树?

底层数据结构是B+tree。

B+tree是基于B-tree的,大部分数据结构相同,但也有一些区别:

1、B+Tree非叶子节点不保存数据信息,只保存关键字和子节点的引用;

2、B+Tree关键字的数据保存在叶子节点中;

3、B+Tree叶子节点是顺序排列的,并且相邻节点具有顺序引用关系;

4、B+Tree由于非叶子节点不存储数据,那么每个节点就可以存储更多的元素,树的层级更少所以查询数据更快,所有数据都存在叶子节点,所以每次查找的次数都相同因而查询速度更稳定;

5、B+Tree通常有两个指针,一个指向根结点,另一个指向关键字最小的叶子结点,因此可以对B+Tree进行两种查找运算:一种是对于关键字的范围查找和分页查找,另一种是从根节点开始,进行随机查找;

9.B+Tree的优势是什么?

B+树的查找和B树一样,类似于二叉查找树,从根节点出发自顶向下遍历树,在节点内部使用二分查找来确定走哪一边的指针;

1.不同的是,B+树中间非叶子节点不存储数据,只有索引,而B树每个结点中的每个关键字都有数据,这样使得同样大小的磁盘页可以容纳更多节点元素,B+树更加“矮胖”,IO操作更少;

2.因为数据的不同,导致查询过程也不同,B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所以性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定;

3.在范围查询方面,B+树的优势更加明显,B树的范围查找需要不断依赖中序遍历。首先二分查找到范围下限,在不断通过中序遍历,直到查找到范围的上限,整个过程比较耗时; 而B+树的范围查找则简单许多,首先通过二分查找,找到范围下限,然后同过叶子结点的链表顺序遍历,直至找到上限即可,效率更高;

10.什么是聚簇索引(主键索引)和非聚簇索引(二级索引)?

聚簇索引就是索引和数据存储在一起的。例如:InnoDB的存储引擎中必须包含主键,如果我们没有指定主键,会生成默认的主键,主键和数据都存储在B+树中,这种索引称为聚簇索引。我们如果使用主键作为查询条件,会直接在B+树中找到具体的数据。

非聚簇索引就是索引和数据是分开存储的。例如:InnoDB的非主键索引都是单独存储在一个B+树中,但叶子节点存储的是具体主键索引的主键值,所以对于非聚簇索引,还需要主键值到聚簇索引中查询到一条完整记录,因此按非聚簇索引检索实际上进行了二次查询,效率肯定是没有按照聚簇索引检索高的。

11.什么是联合索引(复合索引)?

联合索引又叫复合索引,是指由多个字段组成的索引。

12.联合索引的匹配原则是什么?

最左前缀原则。如果我们使用联合索引,那么查询的条件,应当需要包含联合索引定义时最左侧的那个索引字段,最好按顺序。如果我们不按顺序,Mysql默认也会有一个优化器来帮助我们排序。

13.索引是不是越多越好?

索引虽然加快了查询速度,但索引也有代价,索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,MySQL在运行时也要消耗资源维护索引,因此索引并不是越多越好。我们在建立索引时应该考虑离散型问题,一个表字段中的重复数据占比较低,那么它的离散型就越好,就适合做索引,比如身份证号或是手机号之类的字段。如果一个字段的离散型不是很好,我们可以考虑建立联合索引来提高离散型。

14.什么是覆盖索引?

如果我们SQL语句的查询字段,可通过索引节点中的关键字直接返回,则该索引称之为覆盖索引,覆盖索引可减少数据库IO,可提高查询性能;

15.创建联合索引要考虑哪些因素?

1.经常用的列优先 【最左匹配原则】

2.选择性高的列优先【离散性高原则】

3.宽度小的列优先【最少空间原则】

16.为什么不建议使用select * from 来查找数据?

从业务上来讲,如果我们对一张表有字段上的扩展,使用select * from 来查询数据的话,可能会导致我们java程序找不到对应的字段映射从而报错。

从优化角度上来讲,我们指定要查询的具体字段,是让查询语句有可能去命中覆盖索引,从而提高效率。

17.我们在查询记录数量的时候,是使用count(*)还是使用count(id)?为什么?

应当使用count(*),count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,count(*)会统计值为 NULL的行,而 count(列名)不会统计此列为 NULL值的行。

18. 索引失效情况

1.有or必全有索引;
2.复合索引未用左列字段;
3.like以%开头;
4.需要类型转换;
5.where中索引列有运算;
6.where中索引列使用了函数;
7.如果mysql觉得全表扫描更快时(数据少);

19.sql优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

3..应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

4..in 和 not in 也要慎用,否则会导致全表扫描。

5.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

6.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

7.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。    
这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

8.尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间,    
其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。 

9.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

20.约束和索引有什么区别

约束是为了保证表数据的完整性,索引是为了提高查询效率,两者作用不一样!其次种类也不一样。

21.mysql复合索引abc

最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。

(1)如果第一个字段是范围查询需要单独建一个索引;

(2)在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边;

当创建(a,b,c)复合索引时,想要索引生效的话,只能使用 a和ab、ac和abc三种组合!

22.Mysql 原子性实现原理

Undo Log用于实现事务的原子性
Undo Log理解为逻辑日志:记录相反操作

23.Undo Log的作用
 

1.回滚
2.多版本控制: 可以查看之前的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值