最新的MySQL面试题,面试稳了!

我把所有Java相关的面试题和答案都整理成了PDF,并且带书签目录,阅读起来非常方便

面试题及答案PDF下载:https://www.hicxy.com/?p=2645

面试题及答案PDF下载:https://www.hicxy.com/?p=2645

面试题及答案PDF下载:https://www.hicxy.com/?p=2645

1. MySQL索引的注意事项

1、联合索引遵循前缀原则

KEY(a,b,c)WHERE a = 1 AND b = 2 AND c = 3WHERE a = 1 AND b = 2WHERE a = 1#以上SQL语句可以用到索引WHERE b = 2 AND c = 3WHERE a = 1 AND c = 3#以上SQL语句用不到索引

2、LIKE查询,%不能在前

WHERE name LIKE "%wang%"#以上语句用不到索引,可以用外部的ElasticSearch、Lucene等全文搜索引擎替代。

3、 列值为空(NULL)时是可以使用索引的,但MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。可空列需要更多的储存空间,还需要在MySQL内部进行特殊处理。

4、 如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引,例如:
表中只有100条数据左右。对于SQL语句WHERE id > 1 AND id < 100,MySQL会优先考虑全表扫描。

5、 如果关键词or前面的条件中的列有索引,后面的没有,所有列的索引都不会被用到。

6、 列类型是字符串,查询时一定要给值加引号,否则索引失效,例如:
列name varchar(16),存储了字符串"100"
WHERE name = 100;
以上SQL语句能搜到,但无法用到索引。

2. InnoDB 引擎的四大特性是什么?

插入缓冲(Insert buffer)

Insert Buffer 用于非聚集索引的插入和更新操作。先判断插入的非聚集索引是否在缓存池中,如果在则直接插入,否则插入到 Insert Buffer 对象里。再以一定的频率进行 Insert Buffer 和辅助索引叶子节点的 merge 操作,将多次插入合并到一个操作中,提高对非聚集索引的插入性能。

二次写 (Double write)

Double Write 由两部分组成,一部分是内存中的 double write buffer,大小为 2MB,另一部分是物理磁盘上共享表空间连续的 128 个页,大小也为 2MB。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是通过 memcpy 函数将脏页先复制到内存中的该区域,之后通过 doublewrite buffer 再分两次,每次 1MB 顺序地写入共享表空间的物理磁盘上,然后马上调用 fsync 函数,同步磁盘,避免操作系统缓冲写带来的问题。

自适应哈希索引 (Adaptive Hash Index)

InnoDB 会根据访问的频率和模式,为热点页建立哈希索引,来提高查询效率。索引通过缓存池的 B+ 树页构造而来,因此建立速度很快,InnoDB 存储引擎会监控对表上各个索引页的查询,如果观察到建立哈希索引可以带来速度上的提升,则建立哈希索引,所以叫做自适应哈希索引。

缓存池

为了提高数据库的性能,引入缓存池的概念,通过参数 innodb_buffer_pool_size 可以设置缓存池的大小,参数 innodb_buffer_pool_instances 可以设置缓存池的实例个数。缓存池主要用于存储以下内容:

缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲 (insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息 (lock info)和数据字典信息 (data dictionary)。

3. Hash索引和B+树所有有什么区别或者说优劣呢?

首先要知道Hash索引和B+树索引的底层实现原理:

hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据.

那么可以看出他们有以下的不同:

  • hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询.

因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围.

  • hash索引不支持使用索引进行排序,原理同上.
  • hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测.AAAAAAAAB的索引没有相关性.
  • hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询.
  • hash索引虽然在等值查询上较快,但是不稳定.性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差.而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低.

因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度.而不需要使用hash索引.

4. 简单说一说drop、delete与truncate的区别

SQL中的drop、delete、truncate都表示删除,但是三者有一些差别

1、delete和truncate只删除表的数据不删除表的结构
2、速度,一般来说: drop> truncate >delete
3、delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
4、如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

5. int(10) 和 bigint(10) 能存储的数据大小一样吗?

不一样,具体原因如下:

  • int 能存储四字节有符号整数。
  • bigint 能存储八字节有符号整数。

所以能存储的数据大小不一样,其中的数字 10 代表的只是数据的显示宽度。[^13]

  • 显示宽度指明 Mysql 最大可能显示的数字个数,数值的位数小于指定的宽度时数字左边会用空格填充,空格不容易看出。
  • 如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入且能够显示出来。
  • 建表的时候指定 zerofill 选项,则不足显示宽度的部分用 0 填充,如果是 1 会显示成 0000000001。
  • 如果没指定显示宽度, bigint 默认宽度是 20 ,int 默认宽度 11。

后面的问题,大家可以先自己独立思考一下。

另外我把所有Java相关的面试题和答案都整理出来了,给大家参考一下

面试题及答案PDF下载:https://www.hicxy.com/?p=2645

面试题及答案PDF下载:https://www.hicxy.com/?p=2645

面试题及答案PDF下载:https://www.hicxy.com/?p=2645

6. 关系型数据库有什么优势?

7. 请说明InnoDB和MyISAM的区别

8. 触发器的使用场景

9. 存储过程和函数好像差不多,你说说他们有什么区别?

10. 什么是视图?以及视图的使用场景有哪些?

11. 创建索引的语法

12. 在建立索引的时候,都有哪些需要考虑的因素呢?

13. 上面提到了B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引?

14. 数据库的乐观锁和悲观锁是什么?

15. 请说明varchar和text的区别

16. 什么情况下设置了索引但无法使用

17. 为什么要尽量设定一个主键?

18. 什么是存储过程?有哪些优缺点?

19. 同时有多个事务在进行会怎么样呢?

20. FLOAT和DOUBLE的区别是什么?

21. SQL 注入漏洞产生的原因?如何防止?

22. MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?

23. MySql 服务默认端口号是多少 ?

24. SQL 语句有哪些分类?

25. 并发事务带来哪些问题?

26. MySQL复制基本原理流程

27. 解释 MySQL 外连接、内连接与自连接的区别

28. MySQL支持哪些存储引擎?

29. 怎么解决这些问题呢?MySQL的事务隔离级别了解吗?

30. 简单描述MySQL中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响?

31. 优化数据库的方法

32. 外连接(LEFT JOIN/RIGHT JOIN)

33. 索引是什么?有什么作用以及优缺点?

34. MySQL索引的创建原则

35. 你们数据库是否支持emoji表情,如果不支持,如何操作?

36. 为什么用 B+ 树做索引而不用哈希表做索引?

37. 非聚簇索引一定会回表查询吗?

38. SELECT COUNT(*) 在哪个引擎执行更快?

39. MySQL的复制原理以及流程

40. MySQL的binlog有有几种录入格式?分别有什么区别?

41. innodb引擎的特性

42. 说一说三个范式

43. 什么是 SQL

44. 如何优化SQL

45. 创建MySQL联合索引应该注意什么?

46. MySQL 中有哪几种锁?

47. 存储时期

48. 什么是关系型数据库?

49. 创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?

50. 什么是 MySql 视图?

51. InnoDB 存储引擎应用场景是什么?

52. MySQL索引的原理

53. 六种关联查询

54. MySQL数据库cpu飙升到500%的话他怎么处理?

55. 怎么看到为表格定义的所有索引?

56. MySQL的常用操作

57. 使用索引查询一定能提高查询的性能吗?为什么

58. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

59. 那么在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?

60. 字段为什么要求定义为not null?

61. B-Tree 和 B+Tree

62. Innodb使用的是哪种隔离级别呢?

63. 内连接分为三类

64. MySQL 数据库作发布系统的存储,一天五万条以上的增量, 预计运维三年,怎么优化?

65. 索引的使用场景

66. CHAR 和 VARCHAR的区别?

67. 什么是事务?

68. varchar(10)和int(10)代表什么含义?

69. 联合索引是什么?为什么需要注意联合索引中的顺序?

70. 索引是个什么样的数据结构呢?

71. 使用 MySQL 视图有何优点?

72. 全连接(FULL JOIN)

73. MySQL由哪些部分组成, 分别用来做什么

74. 如何在MySQL种获取当前日期?

75. MySQL 里记录货币用什么字段类型好

76. 索引分类

77. innodb的事务与日志的实现方式

78. 如果要存储用户的密码散列,应该使用什么字段进行存储?

79. 横向分表和纵向分表,可以分别举一个适合他们的例子吗?

80. MySQL如何保证复制过程中数据一致性及减少数据同步延时

81. InnoDB和MyISAM有什么区别?

82. 索引的类型

83. 超大分页怎么处理?

84. UNION与UNION ALL的区别?

85. 存储引擎常用命令

86. 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。

87. Explain 性能分析

88. 如果一个表有一列定义为TIMESTAMP,将发生什么?

89. MyISAM存储引擎应用场景有哪些?

90. 什么是存储过程?

91. MyISAM索引实现?

92. MySQL事务处理

93. 什么是触发器,MySQL中都有哪些触发器?

94. 索引的优缺点

95. 以下三条sql 如何建索引,只建一条怎么建?

96. 简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

97. 数据库删除操作中的 delete、drop、 truncate 区别在哪?

98. 超键、候选键、主键、外键分别是什么?

99. 索引对性能的影响:

100. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

101. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

102. 锁机制与InnoDB锁算法

103. MyISAM存储引擎特性有哪些?

104. 对MySQL的锁了解吗?

105. 列值为NULL时,查询是否会用到索引?

106. MySQL 有哪些数据类型?

107. 以下语句是否会应用索引:SELECT FROM users WHERE YEAR(adddate) < 2007;

108. SQL语句优化的一些方法?

109. 什么是MySQL?

110. 锁的优化策略

111. MySQL中的varchar和char有什么区别.

112. 索引的区别

113. VARCHAR(50) 能存放几个 UTF8 编码的汉字?

114. myisamchk 是用来做什么的?

115. drop、delete与truncate分别在什么场景之下使用?

116. 索引的基础

117. 联合查询(UNION与UNION ALL)

118. ACID是什么?可以详细说一下吗?

119. 做过哪些MySQL索引相关优化

120. MySQL锁机制

121. Myql 中的事务回滚机制概述

122. 主键使用自增ID还是UUID?

123. MySQL 存储引擎类型有哪些?

124. MyISAM索引与InnoDB索引的区别?

125. 唯一索引比普通索引快吗, 为什么

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值