1.MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写
2.SQL分类:
.DDL(Data Definition Language)数据定义语言
.用来定义数据库对象:数据库、表、列。关键字:create,drop,alter
.DML(Data Manipulation Language)数据操作语言
.用来对数据库中表的数据进行增删改。关键字:insert, delete, update
.DQL(Data Query Language)数据查询语言
.用来查询数据库中表的记录(数据)。关键字:select, where
.DCL(Data Control Language)数据控制语言(了解)
3.MyBatis是什么?
.MyBatis 是一款优秀的持久层框架。
.支持自定义 SQL、存储过程以及高级映射
.免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
.通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中的记录
4.Mybaits 的优缺点
.优点:
.消除 JDBC 中的重复代码
.可以在 XML 或注解中直接编写 SQL 语句,比较灵活,方便对 SQL 的优化与调整
.SQL 写在 XML 中,与代码解耦,按照对应关系方便管理
.XML 中提供了动态 SQL 的标签,方便根据条件拼接 SQL
.与 Spring 集成比较方便
.缺点:
.字段较多、关联表多时,编写 SQL 工作量较大
.SQL 语句依赖了数据库特性,会导致程序的移植性较差,切换数据库困难
5.MyBatis 的适用场景
.直接编写 SQL,对应多变的需求改动较小
.对性能的要求很高,做 SQL 的性能优化相对简单、直接
6.MyBatis 与 Hibernate 的区别
.MyBatis需要程序员自己编写SQL,Hibernate 可以做到无 SQL 对数据库进行操作
.MyBatis 直接编写原生 SQL,可以严格控制 SQL 执行性能,灵活度高,快速响应需求变化
.Hibernate 会根据模型配置自动生成和执行 SQL 语句,面对多变的需求,灵活度没那么高
即可移植性差
7.sql注入:
.SQL 注入是在编译的过程中,注入了某些特殊的恶意 SQL 片段,被编译成了恶意的 SQL 执行操作
例:select * from user_table where usname='"userName+"' and password='"+password+"'
通过sql注入可为SELECT * FROM user_table WHERE username=''or 1 = 1 -- and password=''
--为注释,此时这个语句一定会成功
8.MyBatis 中实体类的属性名与表中的字段名不一致怎么处理?
.修改 SQL,给查询字段重命名,如 将 user_id 重命名为 userId<sql语句有重命名功能>
select user_id as userId from table
9.MyBatis 有哪些分页的方式?分页插件的原理是什么?
.在 xml 或者 注解的 SQL 中传递分页参数
.使用分页插件 Mybatis-PageHelper
其中分页插件的原理是,使用 MyBatis 提供的插件接口,拦截待执行的 SQL,根据数据库种类
的配置与分页参数,生成带分页 SQL 语句执行
10.分页插件Mybatis-PageHelper:
.使用方法:
PageHelper.startPage(page,pageSize);
PageInfo pageInfo = new PageInfo(list);
.原理总结:
PageHelper首先将前端传递的参数保存到page这个对象中,接着将page的副本存放入ThreadLoacl中,
这样可以保证分页的时候,参数互不影响,接着利用了mybatis提供的拦截器,取得ThreadLocal的值,重新拼装分页SQL,完成分页
11.mybatis执行sql的两种方式:SqlSession和Mapper接口
.使用 Mapper 接口编程可以消除 SqlSession 带来的功能性代码,提高可读性,目前使用mapper已成为主流
12.MyBatis 插件的运行原理:
.MyBatis 插件的运行是基于 JDK 动态代理 + 拦截器链实现
13.什么是JDBC,什么时候用它:
.JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库.
我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果
14.jdbc操作数据库的过程:
.//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取与数据库连接的对象-Connetcion
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zhongfucheng", "root", "root");
//获取执行sql语句的statement对象
statement = connection.createStatement();
//执行sql语句,拿到结果集
resultSet = statement.executeQuery("SELECT * FROM users");
15.jdbc事务管理:
.事务的四个特征(ACID):
原子性:是指事务中包含的操作都被看做是一个逻辑单元
一致性:开始前和结束后数据库都处于一致性状态
隔离性:对数据库修改的多个事务是彼此隔离的
持久性:事务完成之后对系统的影响是永久的
.JDBC接口提供了一个setAutoCommit(boolean flag)方法,可以自动提交事务
.通过Connection对象的rollback方法可以回滚事务
.当事务完成后用commit()显式提交事务
16.数据连接池的工作机制:
.数据库连接池负责分配、管理和释放数据库连接的。数据库连接池在初始化时,会创建一定数量的连接放入连接池中,这些数据库连接的数量是由最小数据库连接数量
来设定的。无论这些数据库连接有没有被使用,连接池一直都将保持有至少有这么多数量的连接。连接池的最大数据库连接数量限制了这个连接池占有的最大连接数,
当应用程序向连接池请求的连接数大于这个限制时,这些请求将会被加入到等待队列中。
17.Mysql数据库优化的方案:
.选取最适用的字段属性
一般说来,数据库中的表越小,在它上面执行的查询也就会越快。创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.
比如:设置邮政编码字段时,可以将CHAR(255)换为CHAR(6)
.使用连接(JOIN)来代替子查询(Sub-Queries)
连接(JOIN)之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作
.事务
事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
.优化的查询语句
在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的
18.MySQL主从复制的流程
.主库db的更新事件被写到binlog(日志的二进制文件)
.主库把binlog的内容发送到从库
.从库启动并发起连接,连接到主库
.从库启动之后,将更新内容写入到slave的db
19.数据库的三个范式:
.第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性
.第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键
第二范式要求每个表只描述一个事情,消除间接依赖
. 第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关
第三范式就是属性不依赖于其它非主属性,减少数据冗余
.如何区分三大范式:
第 一范式和第二范式在于有没有分出两张表,第二范式是说一张表中包含了多种不同的实体属性,那么要必须分成多张表, 第三范式是要求已经分成了多张表,
那么一张表中只能有另一张表中的id(主键),而不能有其他的任何信息(其他的信息一律用主键在另一表查询)
20.数据库乐观锁和悲观锁:
.悲观锁
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁
Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block
实现方式:
即串行操作,一个人操作某一个数据库时,其他人只能等待
.乐观锁
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。
实现方式:
引入version,当多人并行访问修改数据库时,需要验证verison是否一致
21.数据库的隔离级别:
.脏读、不可重复读、幻象读概念说明:
.脏读:指当一个事务正在访问数据A,并且对数据A进行了修改,而数据A还没有事务提交到数据库中,而此时另一个事务访问并使用了数据A,
因为数据A并没有提交可能会回滚,那么此时就发生了脏读
.不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。
.幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
.读未提交 (Read uncommitted):
读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据
. 读提交(Read Committed):
读提交,顾名思义,就是只能读到已经提交了的内容
.可重复读(Repeated Read):
可重复读,顾名思义,就是专门针对“不可重复读”这种情况而制定的隔离级别,自然,它就可以有效的避免“不可重复读”。而它也是MySql的默认隔离级别
.序列化 Serializable:
这是数据库最高的隔离级别,可以避免任何问题,但效率极低,没人使用
22.如何连接MySQL服务端、关闭连接?
.连接:使用指令 mysql -u -p -h -P (-u:指定用户名 -p:指定密码 -h:主机 -P:端口) 连接 MySQL 服务端
.关闭:使用指令 exit 或 quit
23.LIKE 后的%和_代表什么:
.% 代表 0 或更多字符
._ 代表 1 个字符
24.与Oracle相比,Mysql有什么优势?
.Mysql 是开源软件、无需付费
.操作简单、部署方便,用户可以根据应用的需求去定制数据库
.Mysql 的引擎是插件式
25.MySQL提升性能的小技巧:
.只需要一行数据时使用 limit 1
.索引尽量选择较小的列
.不需要的数据在 GROUP BY 之前过滤掉
.不确定长度的字符串字段使用 varchar/nvarchar,如使用 char/nchar 定长存储会带来空间浪费
.不要使用 select *,去除不需要的字段查询
.避免一次性查询过大的数据量
.使用表别名,减少多表关联解析时间
.多表 join 最好不超过 5 个,视图嵌套最好不超过 2 个
.count(1) 比 count(*) 有效
26.*MySQL 单表上亿,怎么优化分页查询
27.索引:
.索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的
28.索引优缺点:
.索引的优点
.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
.索引的缺点
.时间方面:创建索引和维护索引要耗费时间
.空间方面:索引需要占物理空间。
31.mysql的binlog:
.binlog是记录所有数据库表结构变更以及表数据修改的二进制日志(select不会记录,因为这类命令不会修改数据)
32.mysql索引:
.每个表的主键都是索引
.在查询索引时,并没有真正查询数据表,而是查询索引数(b+树)
.聚集索引:会把表中的每行数据都存储到索引叶子结点中-----聚集索引一个表中只有一个,主键默认是聚集索引
普通索引:只会存储索引列,然后根据索引列回数据表中查询
.注意:
不要在索引上做运算 慎用!=
范围条件后索引失效
.MySQL常见的两种存储引擎:
.MyISAM--非聚集索引
.InnoDB(其数据文件本身就是索引文件--聚集索引)
33.MybatisPlus默认主键策略是:全局唯一id(雪花算法)(IDWorker)
.改变主键策略的方法:
1.在建表时设置主键自增
2.在实体类的id字段添加注解
@TableId(type = IdType.AUTO )type = IdType.UUID 、type = IdType.ID_WORKER
private int id;
34.MybatisPlus自动填充功能:
. //自动填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill=FieldFill.INSERT_UPDATE)
private Date updateTime;
35.QueryWrapper复杂条件查询:
.ge/gt/le/lt
.isNULL/isNotNull
.between/notBetween
.like/notLike
36.MybatisPlus可以通过实体类名自动匹配表名(驼峰规则)
37.向MySQL发送一个请求的时候,MySQL到底做了什么:
.客户端发送请求
.服务器先检查缓存,如果命中缓存,则立刻返回缓存中的数据,否则进入下一阶段
.服务器对SQL解析、预处理、再由优化器生成对应的执行计划
.MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询
.将结果返回
>mysql中的一些组件:
.连接器: 身份认证和权限相关(登录 MySQL 的时候)。
.分析器:没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
.优化器:按照 MySQL 认为最优的方案去执行,并不一定是程序员认为的最优解。
38.mysql四层结构:
.连接层:
完成与客户端的连接服务,在该层引入了线程池的概念,为通过认证安全接入的客户端提供线程
.服务层
完成SQL缓存的查询、SQL的分析和优化
.引擎层
存储引擎真正负责MySQL中数据的存储和提取(InnoDB/MyISAM)
.存储层
数据存储层,主要是将数据存储在运行与裸设备的文件系统之上,并完成与存储引擎的交互
39.SQL语句机读是从from开始
40.索引是已经排好序以便快速查找的数据结构
.索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在硬盘中
.频繁的更新修改数据会破坏索引的B+树,导致查询效率准确度变低,因此频繁修改更新的数据库不适合建索引
41.索引的优势和劣势:
.优势:
.1提高数据检索效率,降低数据库的IO成本
.2通过索引对数据进行排序,降低数据排序成本,降低了CPU的消耗
.劣势
.1虽然索引大大提高了查询速度,同时却会降低更新表的速度,因为更新表时,MySQL不仅要保存数据
还要保存一下索引文件每次更新添加了索引列的字段,都会更新键值变化后的索引信息。
42.复合索引优于单值索引,单表的索引一般不要超过五个
43.mysql索引的分类:
.单值索引:
即一个索引只包含单个列,一个表可以有多个单列索引
.唯一索引
索引列的值必须唯一,但允许有空值
.主键索引
设定为主键后数据库会自动建立索引,innodb为聚集索引
.复合索引
即一个索引包含多个列
44.索引的创建时机:
.适合创建索引的情况:
.主键自动创建索引
.频繁作为查询条件的字段应该建立索引
.查询中与其他表关联的字段,外键创建索引
.在高并发的情况下倾向于创建复合索引
.查询中排序的字段通过索引访问能显著提高速度
.查询中统计或者分组的字段
.不适合创建索引的情况:
.表的记录太少(一般300万左右开始考虑优化)
.经常增删改的数据(建立索引会提高查询速度,同时也会降低更新表的速度)
.where条件中用不到的字段不创建索引
.数据差异率不高不适合建立索引,比如性别(数据差异率越高,索引效率越高)
45.MySQL常见瓶颈:
.CPU:CPU饱和一般发生在数据装入内存或者从硬盘读取数据
.IO:硬盘IO瓶颈发生在装入数据远大于内存容量
.服务器硬件的瓶颈