1 Star 0 Fork 31

阿明 / Ebooks

forked from Java精选 / Ebooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
最新2021年MySQL面试题高级面试题及附答案解析.md 11.70 KB
一键复制 编辑 原始数据 按行查看 历史

最新2021年MySQL面试题高级面试题及附答案解析

全部面试题答案,更新日期:01月30日,直接下载吧!

下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF

MySQL

题1:MySQL 中有哪几种隔离级别?

SQL标准定义了四种隔离级别,包括一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

Read uncommitted (读未提交)

Read Committed也被称之为脏读(Dirty Read)。所有事务都可以看到其他未提交事务的执行结果。这个隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。

Read Committed(读已提交)

大多数数据库系统的默认隔离级别,但不是MySQL默认的。

Read Committed满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

Repeatable Read(可重复读)

Repeatable Read是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。

不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

Serializable(串行化)

Serializable是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言来说它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

题2:什么是覆盖索引、回表等,了解过吗?

覆盖索引:查询列要被所建的索引覆盖,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

回表:二级索引无法直接查询所有列的数据,所以通过二级索引查询到聚簇索引后,再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。

题3:B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据?

在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。

当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。

题4:MySQL 的索引有哪些设计原则?

选择唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录

作为查询条件的字段建立索引

某个字段用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为该字段建立索引,可以提高整个表的查询速度

限制索引的数量

索引的数量并不是越多越好,每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。

修改表时,索引过多会使得更新表速度变慢

尽量使用字段数据量少的索引

若索引的字段数据量过长,会导致查询的速度变慢

如:对一个char(200)类型的字段进行全文检索需要的时间肯定比对char(10)类型的字段需要的时间更多

排序、分组和联合字段建立索引

使用order by、group by、distinct和union等操作的字段进行排序操作会浪费很多时间。若为其建立索引,可以有效的避免排序操作

尽量使用前缀索引

索引字段的值很长,最好使用值的前缀来索引

如:text和blog类型的字段,进行全文检索会浪费时间。若只检索字段的部分若干个字符,可以提高检索速度

删除不使用或者很少使用的索引

表中数据被批量更新或数据的使用方式被改变后,原有的一些索引可能不再需要。应当定期清理这些索引

小表不创建索引(超过200w数据的表,创建索引)

包含很多列且不需要搜索非空值时可以考虑不建索引

被用来过滤记录的字段创建索引

primary key 字段,系统自动创建主键的索引 unique key 字段,系统自动创建对应的索引 foreign key 约束所定义的作为外键的字段 在查询中用来连接表的字段 用作为排序(order by的字段)的字段

创建索引必须考虑数据的操作方式,原则是内容变动少,经常被用于查询的字段创建索引,对于经常性变动的表而言,则需要谨慎创建必要的索引

题5:MySQL 中都有哪些触发器?

MySQL数据库中有六种触发器:

Before Insert

After Insert

Before Update

After Update

Before Delete

After Delete

题6:什么是非聚簇索引?

非聚集索引也称为Secondary Index。指的是非叶子节点按照索引的键值顺序存放,叶子节点存放索引键值以及对应的主键键值。

MySQL里除了INNODB表主键外,其他的都是二级索引。MYISAM、memory等引擎的表索引都是非聚集索引。简单点说,就是索引与行数据分开存储。一张表可以有多个二级索引。

题7:count(1)、count(*) 与 count(列名) 有什么区别?

执行效果上来说:

count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。

count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。

count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。

执行效率上来说:

列名为主键,count(列名)会比count(1)快;而列名不为主键,count(1)会比count(列名)快。

如果表多个列并且没有主键,则count(1)的执行效率优于count(*) ,反之如果有主键,则select count(主键)的执行效率最优。

如果表只有一个字段,则select count(*)最优。

实例分析:

mysql> create table counttest(name char(1), age char(2));
Query OK, 0 rows affected (0.03 sec)
 
mysql> insert into counttest values
    -> ('a', '14'),('a', '15'), ('a', '15'), 
    -> ('b', NULL), ('b', '16'), 
    -> ('c', '17'),
    -> ('d', null), 
    ->('e', '');
Query OK, 8 rows affected (0.01 sec)
Records: 8  Duplicates: 0  Warnings: 0
 
mysql> select * from counttest;
+------+------+
| name | age  |
+------+------+
| a    | 14   |
| a    | 15   |
| a    | 15   |
| b    | NULL |
| b    | 16   |
| c    | 17   |
| d    | NULL |
| e    |      |
+------+------+
8 rows in set (0.00 sec)
 
mysql> select name, count(name), count(1), count(*), count(age), count(distinct(age))
    -> from counttest
    -> group by name;
+------+-------------+----------+----------+------------+----------------------+
| name | count(name) | count(1) | count(*) | count(age) | count(distinct(age)) |
+------+-------------+----------+----------+------------+----------------------+
| a    |           3 |        3 |        3 |          3 |                    2 |
| b    |           2 |        2 |        2 |          1 |                    1 |
| c    |           1 |        1 |        1 |          1 |                    1 |
| d    |           1 |        1 |        1 |          0 |                    0 |
| e    |           1 |        1 |        1 |          1 |                    1 |
+------+-------------+----------+----------+------------+----------------------+
5 rows in set (0.00 sec)

题8:key 和 index 有什么区别?

key是数据库的物理结构,它包含两层意义和作用,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key、unique key、foreign key等。

index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;

题9:SQL 语句执行过久,如何优化?从哪些方面入手?

1、查看是否涉及多表和子查询,优化Sql结构,如去除冗余字段,是否可拆表等。

2、优化索引结构,看是否可以适当添加索引。

3、数量大的表,可以考虑进行分离/分表(如交易流水表)。

4、数据库主从分离,读写分离。

5、explain分析sql语句,查看执行计划,优化sql。

6、查看mysql执行日志,分析是否有其他方面的问题。

题10:非聚簇索引一定会回表查询吗?

不一定,如果查询语句的字段全部命中了索引,那么就不必再进行回表查询。

举个简单例子,假设在用户表上建立索引,那么当进行

select age from user where age < 20;

查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。

题11:什么是锁

题12:什么是存储过程如何调用

题13:存储过程有哪些优缺点

题14:视图有哪些优点

题15:如何判断-mysql-是否支持分区

题16:mysql-中-innodb-引擎的行锁是怎么实现的

题17:mysql-中-innodb-引擎-4大特性了解过吗

题18:mysql-中什么是联合索引

题19:mysql-假设一天几万以上的增量预计运维三年怎么优化

题20:什么是聚簇索引

题21:数据库引擎都有哪些

题22:sql-注入漏洞是什么原因造成的如何防止

题23:什么是内连接外连接交叉连接笛卡尔积

题24:mysql_fetch_array-和-mysql_fetch_object有什么区别

题25:mysql-事务都有哪些特性

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/AminDev/ebooks.git
git@gitee.com:AminDev/ebooks.git
AminDev
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891