Mysql
目录
1.7-jdbc的PreparedStatement相比Statement的好处
1.1-数据库的分类以及常用的数据库
分为:关系型数据库和非关系型数据库
- 关系型数据库:Mysql,oracle,sqlserver
- 非关系型数据库:redis,memcache,mogodb,hadoop等
1.2-关系数据库的三范式
范式:范式就是规范,关系型数据库在设计表时,要遵循的三个规范。要想满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式
-
第一范式:是指数据库的每一列都是不可分割的基本数据项,同一列中不能有多个值,也就是实体类中的某个属性不能有多个值或者不能有重复的属性,列数据不可分割
-
第二范数:要求数据库中每个实例或行必须可以被唯一区分的,数据库中所有非主键字段完全依赖主键,不能产生部分依赖,以存储各个实例的唯一标识(主键)
-
第三范式:要求一个数据库表中不包含其他表中已经包含的非关键字信息(外键)
1.3-事务的四个基本特征
事务:是一个并发控制的单位,比如是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位
事务必须满足四大特征:
-
原子性:表示操作事务内操作不可分割,要们都成功,要们都失败
-
一致性:要么成功,要们失败,失败了要对前面的操作进行回滚
-
隔离性:一个事务开始后,不能背其他的事务干扰
-
持久性/持续性:表示事务开始了,就不能终止
1.4-Mysql数据库的最大连接数
特定服务器上面的数据库只能支持一定数目同时连接,这时我们一般都会设置最大连接数(最多同时服务多少连接),在数据库安装时都会有一个默认的最大连接数。
最大连接数为100
1.5-对jdbc的理解
Java只定义接口,让数据库厂商自己实现接口,对于开发而言,只需要导入对应厂商开发的实现即可,然后以接口实现即可,然后进行调用(mysql+mysql驱动(实现)+jdbc)
1.6-jdbc怎么调用存过程
- 加载 jdbc 驱动程序
- DriverManager.getConnection获取连接
- 创建一个Statement
- 执行SQL语句
- 处理执行完SQL之后的结果
- 释放连接
public static void test() throws ClassNotFoundException, SQLException{
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/ssmidea?serverTimezone=UTC
String user = "root";
String password = "root";
//1.注册驱动
Class.forName(driver);
//2.建立连接
Connection conn=DriverManager.getConnection(url,user,password);
//3.创建语句执行对象
Statement st=conn.createStatement();//创建Statement
//4.执行语句
ResultSet rs=st.executeQuery("select * from user");
//5.处理结果
while(rs.next()){
System.out.print(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t");
}
//6.释放资源,资源rs、st、conn的释放顺序与创建顺序相反
rs.close();
st.close();
conn.close();
}
1.7-jdbc的PreparedStatement相比Statement的好处
-
PreparedStatement是预编译的,速度比Statement快
-
代码可读性和可维护性
-
安全性,PreparedStatement可以防止sql注入攻击,而statement不行
1.8-数据库连接池的作用
1:限定数据库连接的个数,不会导致由于数据库连接过多导致系统运行缓慢或者崩溃
2:数据库连接不需要每次都去创建或者销毁,节约了资源
3:数据库连接不需要每次都要去创建,响应时间更快
1.9-数据库优化手段
-
创建索引:创建合适的索引,我们就可以在索引中查询,查询到以后直接找对应的记录
-
分表:当一张表的数据比较多或一张表的某些字段的值比较多,并且很少使用时,采用水平分表和垂直分表来优化
-
读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群
-
缓 存:使用redis来进行缓存
-
一些常用的优化技巧
1.10-查找并定位慢查询
在项目自验项目转测试之前,在启动mysql数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一定的时间后,通过查看日志找到慢查询语句
使用explain慢查询语句,来详细分析语句的问题
1.11-数据库分表
数据库分表有水平(按行)分表和垂直(按列)分表
Mysql数据表一般达到百万级别,查询效率会非常低,容易造成表锁,甚至堆积很多连接,直接挂掉,水平分表能够很大程度减少这些压力
1.12-Mysql事务的隔离级别
1.13-什么是脏读?什么是幻读?什么是不可重复读?
- 脏读:脏读是指当一个事务正在访问数据,并且对数据进行了修改。而这种修改还没有提交到数据库中,这时,另外一个事务也访问了这个数据,然后使用了这个数据。(准备数据回滚了,读取了提交的数据)
- 幻读:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到了表中的全部数据行。同时,第二个事务也修改了这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。(读取了修改前的数据)
- 不可重复读:一个事务多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A每次读取同一数据时,结果不一致。(读取了插入前的数据)
1.14-选择合适的数据库存储引擎
开发中,我们经常使用的是MyISAM/innodb/memory
MyISAM引擎:
如果表对事务的要求不高,同时是以查询和添加为主的,我们考虑使用MyISAM存储引擎
innodb引擎:
对事务要求高,保存的数据都是重要的数据,我们建议使用INNODB
memory引擎:
我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory,速度极快
1.15-MyISAM和innodb的区别
-
事务安全:MyISAM不支持事务,INNODB支持事务
-
查询和添加速度:MyISAM不支持事务,所以不用考虑同步锁,所以查询和删除快,INNODB支持,所以速度比较慢
-
支持全文索引:MyISAM支持,INNODB不支持
-
锁机制:MyISAM支持表锁,而INNODB支持行锁(事务)
-
外键MyISAM不支持外键,innodb支持外键(通常不设置外键,通常是在程序中 保证数据的一致)
1.15-Innodb有哪些特性
-
一:插入缓冲
-
二:二次写
-
三:自适应哈希
-
四:预读
1.16-为什么要分页,Mysql分页怎么使用?
-
为什么需要分页:在数据比较多的时候,不可能完全显示数据,我们需要分段显示
-
Mysql分页实现:MySQL是使用关键字limit进行分页的,limit offset,size,表示所有从多少位索引去多少位
1.17-什么是索引
- 索引是快速查询、更新数据库表中数据的一种一种数据结构。分为普通索引,唯一索引,主键索引,全文索引
1.18-索引的优缺点
缺点:
-
占用磁盘空间
-
对插入修改删除操作有影响,变慢
优点:
-
拆查询速度大大提高
-
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
1.19-索引的四种类型
主键索引: 数据列不允许重复,不可以为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,可以为NULL值,一个表允许多个列创建唯一索引。
- 可以通过 ALTER TABLE table_name ADD UNIQUE (column); //创建唯一索引
- 可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); //创建唯一组合索引
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
- 可以通过ALTER TABLE table_name ADD INDEX index_name (column); //创建普通索引
- 可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);//创建组合索引
全文索引: 是目前搜索引擎使用的一种关键技术。
- 可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引
1.20-索引的基本原理
索引说白了就是把无序的数据进行了有序的查询,索引的目的在于提高查询效率,与我们查看书籍所用的目录是一个道理:先定位到哪一章,然后定位到该章下的哪一个小节,然后找到页数,进行查看。
1.21-索引算法
- BTree算法和Hash算法
BTree是最常用的mysql数据库索引算法,也是mysql默认的算法。
//它的查询条件是一个不以通配符开头的常量
select * from user where name like 'xiaoming%';
Hash检索效率高
1.22-索引设计的原则
-
适合索引的列是出现在where子句中的列,或者连接子句中指定的列
-
基数较小的类,索引效果较差,没有必要在此列建立索引
-
使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间
-
不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引 列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
1.23-数据库要优化的原因
- 加快系统的反应时间
- 数据多的时候,处理时间会变得缓慢
- 数据是存放在磁盘上面面的,读写速度无法和内存相比
1.24-垂直分表的优缺点
优点:
- 可以把一张表中不常用的冗余数据拆分出来,让数据行改变小,查询时间增快,简化了表结构的同时还利于维护
缺点:
- 逻辑改变,整个分表逻辑都会改变,扩展性较差,会让事务变得更加的复杂,查询所有数据需要join操作
1.25-水平分表的优缺点
优点:
- 可以避免数据量过大造成对性能的影响,支持的存储量大
缺点:
- 应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作