大家好,我是温大大

前段时间大家在面试过程中,经常被问到数据库相关的问题。

像:sql 怎么优化,解释下数据库常见锁的,having 和 where 区别等等。

所以温大大爆肝 1 天 2 夜。

肝了「万字」从数据库基础知识、到数据索引、索、事务 以及 面试高频面试题。

包你从 sql 入门到入土,其他面试汇总:

Linux 万字总结

网络 100 道高频面试题

建议可以先收藏,然后遇到有不会了查看目录,直接跳到该目录进行查阅。

目录:

  1. 基础
  1. 索引
  1. 事务
  1. 关键词
  1. MySQL 底层原理
  1. 引擎

0 关联

0.0 数据准备

表创建

drop table if exists test_a;
CREATE TABLE `test_a` (
 `id` varchar(10) NOT NULL,
 `username` varchar(10) NOT NULL,
 `password` varchar(10) NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

drop table if exists test_a_description;
CREATE TABLE `test_a_description` (
 `id` varchar(10) NOT NULL,
 `age` varchar(10) ,
 `address` varchar(50) ,
 `parent_id` varchar(10) NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据创建

insert into test_a values('1','小明','11');
insert into test_a values('2','宁宁','22');
insert into test_a values('3','敏敏','33');
insert into test_a values('6','生生','66');

insert into test_a_description values('1','10','aaa','1');
insert into test_a_description values('2','20','bbb','2');
insert into test_a_description values('3','30','ccc','3');
insert into test_a_description values('4','40','ddd','4');

0.1 关联

内连接(inner join)


外连接



全连接(full join)


联合 (union / union all)

select * from A   
union
select * from B

0.2 数据库的三大范式

第 1 范式


第 2 范式


第 3 范式


2NF 和 3NF 的区别

1 索引

1.1 什么是索引

索引是存储引擎用于提高数据库表的访问速度的一种「数据结构」。

1.2 索引的优缺点

优点:

缺点:

1.3 索引的作用?

1.4 索引的数据结构

B+ 树索引


哈希索引


Hash 索引和 B+ 树索引的区别?


为什么 B+ 树比 B 树更适合实现数据库索引?

1.5 索引的分类

1.6 索引的设计原则

设计原则

1.7 索引的失效原则

导致索引失效的情况

1.8 哪些场景 能 建立索引

1.9 哪些场景 不能 建立索引

1.10 什么是最左匹配原则?

最左匹配原则

1.11 什么是聚集索引?

1.12 什么是覆盖索引?

explain select blog_id from user_like where user_id = 13;
explain select user_id from user_like where blog_id = 1;

1.13 什么是前缀索引?

ALTER TABLE table_name ADD KEY(column_name(prefix_length));

1.14 什么是分库分表?

原因:索引不能提升性能时,引入分库分表


垂直划分


水平划分

1.15 什么是分区表?


分区表类型

CREATE TABLE test_range_partition(
       id INT auto_increment,
       createdate DATETIME,
       primary key (id,createdate)
   ) 
   PARTITION BY RANGE (TO_DAYS(createdate) ) (
      PARTITION p201801 VALUES LESS THAN ( TO_DAYS('20180201') ),
      PARTITION p201802 VALUES LESS THAN ( TO_DAYS('20180301') ),
      PARTITION p201803 VALUES LESS THAN ( TO_DAYS('20180401') ),
      PARTITION p201804 VALUES LESS THAN ( TO_DAYS('20180501') ),
      PARTITION p201805 VALUES LESS THAN ( TO_DAYS('20180601') ),
      PARTITION p201806 VALUES LESS THAN ( TO_DAYS('20180701') ),
      PARTITION p201807 VALUES LESS THAN ( TO_DAYS('20180801') ),
      PARTITION p201808 VALUES LESS THAN ( TO_DAYS('20180901') ),
      PARTITION p201809 VALUES LESS THAN ( TO_DAYS('20181001') ),
      PARTITION p201810 VALUES LESS THAN ( TO_DAYS('20181101') ),
      PARTITION p201811 VALUES LESS THAN ( TO_DAYS('20181201') ),
      PARTITION p201812 VALUES LESS THAN ( TO_DAYS('20190101') )
   );
create table test_list_partiotion
   (
       id int auto_increment,
       data_type tinyint,
       primary key(id,data_type)
   )partition by list(data_type)
   (
       partition p0 values in (0,1,2,3,4,5,6),
       partition p1 values in (7,8,9,10,11,12),
       partition p2 values in (13,14,15,16,17)
   );
create table test_hash_partiotion
   (
       id int auto_increment,
       create_date datetime,
       primary key(id,create_date)
   )partition by hash(year(create_date)) partitions 10;

分区的问题

例子:
当查询访问分区表时,MySQL 需要打开并锁住所有的底层表,
这个操作在分区过滤之前发生,所以无法通过分区过滤来降低此开销,
会影响到查询速度。可以通过批量操作来降低此类开销,比如批量插入、
LOAD DATA INFILE和一次删除多行数据
例子:
重组分区,会先创建一个临时分区,
然后将数据复制到其中,最后再删除原分区。

2 锁

2.1 共享锁和排他锁是什么

共享锁

用法


排他锁

用法


加锁原则

事务

3.1 事务四大特性

事务特性 ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

3.2 事务隔离级别有哪些

  1. 问题

  1. 区别

  1. 事务隔离就是为了解决上面的问题

4 关键词

4.1 having 和 where 区别?

4.2 exist 和 in 的区别?

select a.* from A awhere exists(select 1 from B b where a.id=b.id)
select * from Awhere id in(select id from B)

4.3 truncate、delete 与 drop 区别?

相同

不同

4.4 bin log/redo log/undo log 有什么区别?

MySQL 日志主要包括查询日志、慢查询日志、事务日志、错误日志、二进制日志等。 其中比较重要的是

bin log

redo log

undo log

4.5 int(10) 和 char(10) 的区别?

4.6 preparedStatement 和 statement 的区别?

4.7 union 和 union all 的区别?

4.8 数据库查询语言 DQL/DML/DCL 区别?

5 mysql 执行原理

5.1 查询执行流程

查询语句的执行流程如下: 权限校验、查询缓存、分析器、优化器、权限校验、执行器、引擎。

举个例子,查询语句如下:

select * from user where id > 1 and name = '温大大';

5.2 更新执行流程

更新语句执行流程如下:分析器、权限校验、执行器、引擎、redo log(prepare 状态)、binlog、redo log(commit 状态)

举个例子,更新语句如下:

update user set name = '温大大' where id = 1;

5.3 MySQL 架构

MySQL 主要分为


Server 层:


存储引擎:

6 引擎

6.1 MyISAM

简介


特性

6.2 InnoDB

简介


特性

6.3 MEMORY

简介


特性

6.4 MERGE

简介


特性

6.5 Archive

简介

6.6 引擎选择

不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:

后续:最近 3-4 月份面试的人挺多的,如果你也想抓住这次涨薪的机会, 关注我,加我好友拉你进面试群,一起讨论面试干货 / 套路, 大家一起升职加薪,关注公众号:测试猿温大大


↙↙↙阅读原文可查看相关链接,并与作者交流