关于事务还有一点补充的东西,就是一个事务是怎么实现的?
在InnoDB存储引擎中,提供了一组用于记录事务性活动的日志文件。在事务的执行过程中,每一条DML语句操作都会记录到‘事务性活动的日志文件’中。在事务的执行过程中我们可以提交事务也可以回滚事务。
提交事务
清空事务性活动的日志文件。将数据全部持久化到数据库表中。标志事务的结束
回滚事务
将所有的操作全部撤销,并且清空事务性活动的日志文件,并且事务的结束。以失败的方式。
mysql中默认的事务行为是什么样的?
自动提交。那么交给我们来管理事务应该怎么做呢?使用命令 start transaction;关闭了自动提交。
索引
所谓的索引,就是在数据库表中的字段上添加的一种让我们提高查询效率的机制。为了缩小扫描范围的一种机制。
没有添加索引就一条记录一条记录的匹配,全表扫描,添加了索引就是根据索引找到一个范围位置,然后再这个范围内做局域性的扫描。
实际上索引也是一张表,该表保存了主键和索引字段,并且指向了实体表的记录。
创建索引的时候,需要确保索引是应用在查询语句的条件中
同样索引也是需要排序的,并且索引的排序和TreeSet数据结构相同。TreeSet底层是一个自平衡的二叉树。mysql中的索引是一个B-Tree数据结构。使用左小右大的方式进行存放。
索引的实现原理
(自平衡二叉树)B树,
每一条记录在磁盘上都有一个物理的编号。例如查101号记录,通过索引对象快速定位到101(缩小扫描范围)得到物理编号,进行sql语句的转换,查询条件编程查询物理编号。这是最简单的实现原理。
什么情况下我们会添加索引?
数据量非常庞大的时候;该字段经常出现在where字段的后面,经常被扫描。该字段很少进行增删改(DML)操作。
建议使用主键去查询,或者通过unique来查,不建议随便添加索引。因为索引还需要进行维护。
创建索引
-- 创建索引 --
create index '索引名' on '表名'('字段名');
-- 删除索引 --
drop index '索引名' on '表名';
-- 查看sql语句是否用了索引--
explain select * from 表名 where 存在索引的字段名的条件
-- 复合索引 --
create index '索引名' on '表名' ('字段名1','字段名2');
索引失效情况
模糊查询‘%’开头失效,这是一种优化手段。原因是查找的时候使用第一个字母进行匹配。
使用or的时候会失效,要求两边的字段都要索引,才会走索引。
使用复合索引的时候,没有使用左侧的列查找索引失效。
在where条件中,索引列参加了数学运算。
where当中索引列使用了函数。
索引在数据库进行优化的时候是优先考虑的因素
索引分类
单一索引
复合索引
主键索引
唯一性索引:具有unique约束的字段上添加索引
注意,唯一性所以比较弱的字段上添加索引用处不大
补充知识:
视图
什么是视图?
view:站在不同的角度去看待同一份数据。
怎么创建视图对象?怎么删除视图?
-- 表复制 --
create table 新表 select * from 旧表 where 查询条件;
-- 复制表方式2 --
create table 新表 like 旧表;
-- 删除视图 --
drop view 视图名;
-- 创建视图 --
create view '视图名' as 查询语句;
视图有什么用?
面向视图对象的增删改查会导致原表的数据被修改。
视图对象在实际开发中有什么用?
简化sql语句的书写,我们以后在面向视图开发的时候,使用视图的时候可以像使用table一样,可以对视图进行增删改查等操作,视图不是在内存中,而是在物理硬盘中,不会消失。
DBA命令(了解)
-- 创建新用户 --
create user 用户民 identified by 该用户的登录密码
-- 数据的导入 --
登录mysql服务器,创建同名数据库,使用数据库
source 数据文件的绝对路径
source D:\ssm_db.sql
-- 数据的导出 --
mysqldump -u root -p 数据库名>导出的路径
mysqldump -u root -p spring_db > D:\ssm_db.sql
数据库设计三范式
数据库表设计需要遵守的规则,
要求任何一张表都有主键,每一个字段原子性不能再分
建立在第一范式的基础上,要求所有的非主键字段完全依赖于主键,不要产生部分字段依赖
建立在第二范式的基础上,要求所有非主键字段直接依赖主键。不要产生传递依赖。
数据库表的设计尽量满足客户的需求,以客户需求为准。
多对多三张表,关系表两外键。