大厂面试常问的MySQL 68题及答案
今天给大家分享MySQL常考的面试题,让你跟面试官 So easy,看看你们能答对多少。
目录:
1、一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15?
2、Mysql的技术特点是什么?
3、Heap表是什么?
4、Mysql服务器默认端口是什么?
5、与Oracle相比,Mysql有什么优势?
6、如何区分FLOAT和DOUBLE?
7、区分CHAR_LENGTH和LENGTH?
8、非聚簇索引一定会回表查询吗?
9、数据库三大范式是什么
10、数据库为什么使用B+树而不是B树
11、SQL的生命周期?
12、主键索引与唯一索引的区别
13、MySQL数据库cpu飙升的话,要怎么处理呢?
14. 日常工作中你是怎么优化SQL的?
15.数据库索引的原理,为什么要用 B+树,为什么不用二叉树?
16. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?
17. 如果某个表有近千万数据,CRUD比较慢,如何优化。
18、请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
19、在Mysql中ENUM的用法是什么?
20、如何定义REGEXP?
21、CHAR和VARCHAR的区别?
22、列的字符串类型可以是什么?
23、如何获取当前的Mysql版本?
24、Mysql中使用什么存储引擎?
25、Mysql驱动程序是什么?
26、TIMESTAMP在UPDATECURRENT_TIMESTAMP数据类型上做什么?
27、主键和候选键有什么区别?
28、如何使用Unixshell登录Mysql?
29、myisamchk是用来做什么的?
30、MYSQL数据库服务器性能分析的方法命令有哪些?
31、如何控制HEAP表的最大尺寸?
32、MyISAMStatic和MyISAMDynamic有什么区别?
33、federated表是什么?
34、如果一个表有一列定义为TIMESTAMP,将发生什么?
35、列设置为AUTOINCREMENT时,如果在表中达到最大值,会发生什么情况?
36、怎样才能找出最后一次插入时分配了哪个自动增量?
37、你怎么看到为表格定义的所有索引?
38、LIKE声明中的%和_是什么意思?
39、如何在Unix和Mysql时间戳之间进行转换?
40、列对比运算符是什么?
41、我们如何得到受查询影响的行数?
42、Mysql查询是否区分大小写?
43.、LIKE和REGEXP操作有什么区别?
44.、BLOB和TEXT有什么区别?
45、mysql_fetch_array和mysql_fetch_object的区别是什么?
46、我们如何在mysql中运行批处理模式?
47、MyISAM表格将在哪里存储,并且还提供其存储格式?
48.、Mysql中有哪些不同的表格?
49、ISAM是什么?
50、InnoDB是什么?
51、Mysql如何优化DISTINCT?
52、如何输入字符为十六进制数字?
53、如何显示前50行?
54、可以使用多少列创建索引?
55、NOW()和CURRENT_DATE()有什么区别?
56、什么样的对象可以使用CREATE语句创建?
57、Mysql表中允许有多少个TRIGGERS?
58、什么是非标准字符串类型?
59、什么是通用SQL函数?
60、解释访问控制列表
61、MYSQL支持事务吗?
62、mysql里记录货币用什么字段类型好
63、MYSQL数据表在什么情况下容易损坏?
64、mysql有关权限的表都有哪几个?
65、Mysql中有哪几种锁?
66、select for update有什么含义,会锁表还是锁行还是其他。
67、索引的数据结构(b树,hash)
68. mysql中in 和exists的区别。
具体内容:
1、一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15?
(1)如果表的类型是MyISAM,那么是18因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失(2)如果表的类型是InnoDB,那么是15InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失
2、Mysql的技术特点是什么?
Mysql数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程SQL服务器、不同的后端、广泛的应用程序编程接口和管理工具。
3、Heap表是什么?
HEAP表存在于内存中,用于临时高速存储。BLOB或TEXT字段是不允许的只能使用比较运算符=,<,>,=>,=<HEAP表不支持AUTO_INCREMENT索引不可为NULL
4、Mysql服务器默认端口是什么?
Mysql服务器的默认端口是3306。
5、与Oracle相比,Mysql有什么优势?
Mysql是开源软件,随时可用,无需付费。Mysql是便携式的带有命令提示符的GUI。使用Mysql查询浏览器支持管理
6、如何区分FLOAT和DOUBLE?
以下是FLOAT和DOUBLE的区别:浮点数以8位精度存储在FLOAT中,并且有四个字节。浮点数存储在DOUBLE中,精度为18位,有八个字节。
7、区分CHAR_LENGTH和LENGTH?
CHAR_LENGTH是字符数,而LENGTH是字节数。Latin字符的这两个数据是相同的,但是对于Unicode和其他编码,它们是不同的。
8、非聚簇索引一定会回表查询吗?
不一定,如果查询语句的字段全部命中了索引,那么就不必再进行回表查询(哈哈,覆盖索引就是这么回事)。
举个简单的例子,假设我们在学生表的上建立了索引,那么当进行select age from student where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。
9、数据库三大范式是什么?
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。
10、数据库为什么使用B+树而不是B树
1、 B树只适合随机检索,而B+树同时支持随机检索和顺序检索;
2、 B+树空间利用率更高,可减少I/O次数,磁盘读写代价更低。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。B+树的内部结点并没有指向关键字具体信息的指针,只是作为索引使用,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素;
3、 B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而在B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。
4、 B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。
5、 增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
11、SQL的生命周期?
1、 应用服务器与数据库服务器建立一个连接
2、 数据库进程拿到请求sql
3、 解析并生成执行计划,执行
4、 读取数据到内存并进行逻辑处理
5、 通过步骤一的连接,发送结果到客户端
6、 关掉连接,释放资源
12、主键索引与唯一索引的区别
1、 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
2、 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
3、 唯一性索引列允许空值,而主键列不允许为空值。
4、 主键列在创建时,已经默认为空值 ++ 唯一索引了。
5、 一个表最多只能创建一个主键,但可以创建多个唯一索引。
6、 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
7、 主键可以被其他表引用为外键,而唯一索引不能?
13、MySQL数据库cpu飙升的话,要怎么处理呢?
排查过程:
1、 使用top 命令观察,确定是MySQLd导致还是其他原因。
2、 如果是MySQLd导致的,show processlist,查看session情况,确定是不是有消耗资源的sql在运行。
3、 找出消耗高的 sql,看看执行计划是否准确, 索引是否缺失,数据量是否太大。
处理:
1、 kill 掉这些线程(同时观察 cpu 使用率是否下降),
2、 进行相应的调整(比如说加索引、改 sql、改内存参数)
3、 重新跑这些 SQL。
其他情况:
也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等
14. 日常工作中你是怎么优化SQL的?
可以从这几个维度回答这个问题:
- 加索引
- 避免返回不必要的数据
- 适当分批量进行
- 优化sql结构
- 分库分表
- 读写分离
15.数据库索引的原理,为什么要用 B+树,为什么不用二叉树?
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
「为什么不是一般二叉树?」
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。
「为什么不是平衡二叉树呢?」
我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。
「那为什么不是B树而是B+树呢?」
1)B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。
2)B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
16. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?
- 读未提交(Read Uncommitted)
- 读已提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(Serializable)
Mysql默认的事务隔离级别是可重复读(Repeatable Read)
17. 如果某个表有近千万数据,CRUD比较慢,如何优化。
分库分表
某个表有近千万数据,可以考虑优化表结构,分表(水平分表,垂直分表),当然,你这样回答,需要准备好面试官问你的分库分表相关问题呀,如
- 分表方案(水平分表,垂直分表,切分规则hash等)
- 分库分表中间件(Mycat,sharding-jdbc等)
- 分库分表一些问题(事务问题?跨节点Join的问题)
- 解决方案(分布式事务等)
索引优化
除了分库分表,优化表结构,当然还有所以索引优化等方案~
完整答案已整理好
最后别忘了点赞三连,祝各位看官老爷面试一招击敌,旗开得胜