三、存储引擎(只需要了解即可)
1、存储引擎是mysql中特有一个术语,其他数据库中没有
实际上存储引擎就是一个表的存储/组织数据的方式。
不同的存储引擎,表存储数据的方式不同。
2、mysql默认的存储引擎是:InnoDB(比较安全,但是不太能节省空间)
mysql默认的字符编码方式是:utf8
3、建表时指定存储引擎,以及字符编码方式。
create table t_product(
id int primary key,
name varchar(255)
)engine=InnoDB default charset=gbk;
4、查看mysql支持哪些存储引擎,支持9大存储引擎。
命令: show engines \G
这里如果后面需要的话,在进行一个详细的查询不同引擎的特点等
---------------------------------------------------------------------------------------------------------------------------------
四、事务(重点: 五颗星*****,必须理解,必须掌握)
1.
一个事务其实就是一个完整的业务逻辑。一个事务是一个最小的工作单位,不可以再分。
什么是一个完整的业务逻辑?
假设转账,从A账户向B账户中转账1000元,
将A账号的钱减去1000元,(update)
将B账号中的钱加上1000元(update),
这就是一个完整的业务逻辑。
以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。
这两个update语句要求必须同时成功或者失败,这样才能保证钱是正确的。
2.
只有DML语句才会有事务这一说,其他语句与事务无关!!!
insert delete update 只有这三个语句和事务由关系,其他没有任何关系。
因为数据库中涉及到增删改操作的时候,一定要考虑数据安全问题。数据安全第一位。
3.
因为做某件事的时候,需要多条DML语句共同联合起来才能完成,所以需要事务的存在。
事务的本质就是多条DML语句同时成功,或者同时失败!
4.
事务怎样做到多条DML语句同时成功,或者同时失败的呢?
InnoDB存储引擎,提供一组用来记录事务性活动的日志文件
事务处理过程::
事务开启了!
insert
insert
insert
delete
update
delete
事务结束了!
在事务 的执行过程中,每一条DML的操作都会记录到”事务性活动的日志文件“中。
在事务的执行过程中,我们可以提交事务,也可以回滚事务。
提交事务?
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
提交事务标志着,事务的结束。并且是一种全部成功的结束。
回滚事务?
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
回滚事务标志着,事务的结束。并且是一种全部失败的结束。
5.
提交事务:commit;语句
回滚事务:rollback;语句
mysql当中如果不加事务开启了的指令,默认每执行一条增删改的语句,自动提交。
这种自动提交实际上不符合开发逻辑,因为业务逻辑通常是多条DML语句共同使用。
事件回滚的时候只能回滚到上次提交的地方。
怎么将mysql的自动提交机制关闭掉呢?transaction(事务)
先执行这个命令: start transaction;
然后在执行DML命令:insert
update
最后事务结束命令:commit;
6.
事务包括4个特性?
A:原子性、
说明事务是最小的工作单元,不可再分。
C:一致性
所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性;
I:隔离性
A事务与B事务之间具有一定的隔离。
A事务在操作一张表的时候,另一个事务B也操作这张表会怎样???
D:持久性
事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上!
7.
研究一下隔离性!!!
事务和事务之间的隔离级别有哪些呢?4个级别
读未提交:read uncommitted(最低的隔离级别)
什么是读未提交? 事务a可以读到事务b未提交的数据。
这种隔离级别存在的问题是:脏读现象!我们称为读到了脏数据。
这种隔离级别一般都是理论上的,大多数的数据库的隔离级别都是二档起步!
读已提交:read committed
事务a只能读取到事务b提交之后的数据。解决了脏读现象
存在问题?不可重复读取数据。意思就是事务开启之后,第一次读到的数据是3条,当前事务还没有结束
下一次读取的时候数据是4条,3不等于4称为不可重复读取。这种读取的数据是最真实的。
oracle数据库中默认的隔离级别就是:read committed
可重复读:repeatable read
事务A开启后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务
A读取到的数据还是没有发生改变,这就是可重复读。带来的问题是幻影,数据不够真实!
mysql默认的隔离级别就是这个。早上9点开始事务,只要事务不结束,到晚上9点,读到的数据还是那样!
序列化/串行化:serializable(最高的隔离级别)
这是最高隔离级别,效率最低,解决所有的问题。这种隔离级别表示事务排队,不可以同步进行。
每一次读到的数据都是最真实的,并且效率是最低的。
---------------------------------------------------------------------------------------------------------------------------------
六、索引(index)
1.
索引是数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
一张表的一个字段可以添加一个索引,也可以多个字段联合添加索引。
索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制,
2.
mysql在查询方面主要就是两种方式:
第一种方式:全表扫描
第二种方式:根据索引检索。
索引利用的是数据结构B数来进行存储的
B树左小右大,采用中序遍历方式取数据。可以根据数据结构的查询方法快速查询到某一个区间。
给字段设置一个索引,可以通过查索引,查询到某一区间的字段,在进行全部扫描,效率高
提醒一:在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是pk。
另外在mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象。
提醒二:在任何一个数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
提醒三:在mysql当中,索引是一个单独的对象,在不同的存储引擎以不同的形式存在,索引在mysql当中都是一个树的形式存在。
(自平衡二叉树:B-Tree)
3.
什么条件下,我们会考虑到给字段添加索引呢?
条件1:数据量大(到底有多大算庞大,这个需要测试,因为每一个硬件环境不同)
条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。
条件3:该字段很少的DML操作。因为DML之后,索引需要重写排序。
建议不要随意添加索引,因为索引是需要维护的。太多的话反而会降低系统的性能。
建议通过主键查询,建议通过unique约束的字段进行查询,效率比较高。
4.
索引的创建和删除语法?
创建索引:create index emp_ename_index on emp(ename);
给emp表的ename字段添加索引,起名:emp_ename_index
删除索引:
drop index emp_enaem_index on emp;
将emp表上的emp_ename_index 索引对象删除
5.
怎么查看一个sql语句是否使用了索引进行检索?
explain select * from emp where ename='KIng';
6.索引有失效的时候,什么时候索引失效呢?
6.1、
使用模糊查询的时候用”%“开头的时候索引会失效
6.2、
使用or的时候会失效,如果使用or要求or两边的条件字段都要有索引,才会走索引,如果其中一边有一个字段没有索引,那么另一个
字段上的索引也会失效。所以这就是为什么不建议使用or的原因。可以使用union
6.3
使用复合索引的时候,没有使用左侧的列查找,索引失效
两个字段联合起来添加一个索引,叫做复合索引。
6.4
在where当中索引列参加了运算,索引失效。
explain select * from emp where sal+1=800;
6.5
在where当中索引列使用了函数
explain select * from emp where lower(ename)=‘smith’;
7、
索引是各种数据库进行优化的重要手段。优化的时候优先考虑的因素就是索引。
索引在数据库当中分了很多类?
单一索引:一个字段上添加索引。
复合索引:两个字段或者更多的字段上添加索引。
主键索引:主键上添加索引。
唯一性索引:具有unique约束的字段上添加索引。
注意:唯一性比较弱的字段上添加索引用处不大。
---------------------------------------------------------------------------------------------------------------------------------
七、视图(view)
1.
什么是视图?
view:站在不同的角度去看待同一份数据。
2.
创建视图对象:
create view dept2_view as select * from dept2;
删除视图对象:
drop view dept2_view;
注意:只有DQL语句才能以view 的形式创建。
create view view_name as 这里的语句必须是DQL语句;
3
用视图干啥呢?
我么可以面向视图对象进行增删改查,对视图对象的增删改查,会导致原表的数据被操作!
(视图的特点:通过对视图的操作,会影响到原表数据。)
4.
视图对象在实际开发中到底有什么用?(方便,简化开发,利于维护)
假设有一条非常复杂的SQL语句,而这条语句需要在不同的位置上反复使用。
每一次使用这个sql语句的时候都需要重写编写,很长,很麻烦,怎么办?
可以把这条复杂的sql语句以视图对象的形式新建。
在需要编写这条sql语句的位置直接使用视图对象,可以大大简化开发。
并且利于后期的维护,因为修改的时候也只需要修改一个位置就行,只需要修改视图对象所映射的sql语句。
我们以后面向视图开发的时候,使用视图的时候可以像使用table一样。
可以对视图进行增删改查等操作。视图不是在内存当中,视图对象是存储在硬盘上的,不会消失。
在提醒一下:
视图对应的语句只能是DQL语句;
增删改查:又叫做:CRUD。程序员的术语
------------------------------------------------------------------------------------------------------------------------------
八、DBA常用命令?
这个后期在进行补写,不太重要;
-------------------------------------------------------------------------------------------------------------------------------
九、数据库设计的三范式
1、
什么是数据库设计范式?
数据库的设计依据,教你怎么进行数据库表的设计。
2、
数据库的设计范式共有?
3个
第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段必须完全依赖主键,不要产生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
声明:三范式是面试官经常问的。
设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。
3、
第一范式
最核心,最重要的范式,所有表的设计都需要满足。
必须要有主键,并且每一个字段都是原子性不可再分。
这里要有例子后期加:
4.
第二范式
建立在第一范式的基础之上,要求所有非主键字段必须完全依赖主键,不要产生部分依赖。
这里要有例子后期加:
背口诀:
多对多怎么设计?
多对多,三张表,关系表俩个外键!!!!!!!!
5.
第三范式
建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
这里要有例子后期加:
补充:
- 触发器:
详细解释见
https://www.cnblogs.com/javabg/p/9990078.html
- (mysql不一定能全部支持)Check约束:
1.
SQL CHECK 约束
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
2.mysql创建check约束语法。
2.1、
下面的 SQL 在 "Persons" 表创建时在 "P_Id" 列上创建 CHECK 约束。CHECK 约束规定 "P_Id" 列必须只包含大于 0 的整数。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
CHECK (P_Id>0)
)
2.2、
如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)
3、
当表已被创建时,如需在 "P_Id" 列创建 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons alter table class1
ADD CHECK (P_Id>0) add check (classno >0);
如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
4、
如需撤销 CHECK 约束,请使用下面的 SQL
ALTER TABLE Persons
DROP CHECK chk_Person