数据库知识点

断言:一个断言就是数据库需要时刻满足的某一条件。

授权:对不同用户在数据库中的不同数据值上允许不同的访问类型。这些区别以授权来表达。读权限、插入权限、更新权限、删除权限。

一、事务
事务:数据库应用中完成单一逻辑功能的操作集合。
事务四大特性 (ACID):
Automic原子性:事务所有操作在数据库中要么全部正确反映、要么全部不反应
Consistency一致性,执行事务前后保持数据库一致性
Isolation隔离性,每个事务都感觉不到系统中有其他事务在并发执行
Durablitity持久性,一旦事务提交,对数据的改变就是永久的

二、触发器
触发器是一条语句,当对数据库作修改时,自动被系统执行,设置触发器,要知道执行触发器的条件以及触发器的动作。
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

三、存储过程
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
调用: 1)可以用一个命令对象来调用存储过程。
2)可以供外部程序调用,比如:java程序。

存储过程的优缺点?
优点: 1)存储过程是预编译过的,执行效率高。 2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。 3)安全性高,执行存储过程需要有一定权限的用户。 4)存储过程可以重复使用,可减少数据库开发人员的工作量。
缺点:移植性差

存储过程与函数的区别:


数据库知识点_第1张图片
image.png

四、索引:
索引:对数据库中单列或者多列的值进行排序的一种结构,相当于目录。

create index studentID_index on student(ID)

优点:提高查询速度。
缺点:是更新数据时效率低,因为要同时更新索引
对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。

什么样的字段适合建索引?
唯一、不为空、经常被查询的字段。

索引类型有哪些?**
简单索引(基本索引)
唯一索引(列值唯一,可以有null)
主键索引(列值唯一,不可以有null,表中只有一个)
组合索引(多列值组成一个索引,专用于组合搜索,效率大于索引合并)
全文索引(对文本内容进行分词、搜索)

索引的原理是B+树(数据有序、范围查询)
原因:1、保证树高,减少IO请求的次数
2、保证树宽,有利于范围查找

索引匹配原则:最左匹配原则

索引的底层实现(B+树,为何不采用红黑树,B树)
增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间
B树,查询性能不稳定,查询结果高度不致,
B树,每个结点保存指向真实数据的指印,相比B+树每一层每屋存储的元素更多,显得更高一点。

聚集索引和非聚集索引区别
聚集索引,数据按索引顺序存储,中子结点存储真实的物理数据
非聚集索引,存储指向真正数据行的指针

五、视图与游标
视图:是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改会影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

视图的优缺点:
优点: 1)对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 2 )用户通过简单的查询可以从复杂查询中得到结果。 3 )维护数据的独立性,试图可从多个表检索数据。 4 )对于相同的数据可产生不同的视图。
缺点: 性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么就无法更改数据

表和视图的关系
视图:一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。
表:关系数据库中实际存储数据用的。

六、数据库表的操作:
1、列举几种表连接方式,有什么区别?
内连接、自连接、外连接(左、右、全)、交叉连接。
内连接:只有两个元素表相匹配的才能在结果集中显示。
外连接:
左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。只显示左边表的属性数据,右边独有的ix
右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
全外连接:连接的表中不匹配的数据全部会显示出来。 交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。

2、主键和外键的区别?
主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

3、在数据库中查询语句速度很慢,如何优化?

1.建索引
2.减少表之间的关联
3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面
4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
5.尽量用PreparedStatement来查询,不要用Statement(防止SQL注入)

4、数据库三范式是什么?
第一范式:无重复的列(无重复的属性),每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
第二范式:行可以唯一区分,主键约束 。非主属性非部分依赖于主关键
第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束。属性不依赖于其它非主属性。(我的理解是消除冗余)
且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上

5、union和union all有什么不同?
UNION:表链接后对结果集进行排序、去重。
UNION ALL:只是简单的将两个结果合并后就返回,不去重。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

6、order by与group by的区别
order by 排序查询、asc升序、desc降序
group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。

7、怎么去除去重:使用distinct关键字

六、数据库存储引擎 InnoDB索引和MyISAM索引的区别:

一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别(叶节点的data域存放的是数据记录的地址)。

七、数据库隔离级别


数据库知识点_第2张图片
image.png

脏读:事务A读取数据过程中,事务B对数据进行了

八、SQL优化:
数据库优化的总结

(一)最重要的就是避免全表扫描
为了防止数据库引擎放弃使用索引而进行全表扫描,可以避免以下SQL语句:
where中使用字段进行null值判断【可设字段的默认初始值为0,判断是否为0】
where中使用!=或 <>(因为索引只能说明什么在数据库,而不能说明什么不在,!=会放弃使用索引)
where中使用or来连接条件【当两个or的两个字段一个有索引一个无索引时会导致全表扫描===> 可写成多条sql语句,再用union all 求并集】
where中使用in/not in
【对于连续值:可改为用between;对于用in在where再进行一层select的(select num from a where num in(select num from b) ),可以改为exists:(select num from a where exists(select 1 from b where num=a.num)】
where 中的“=”左边进行函数、算术运算或其他表达式运算
【如select id from t where num/2=100; 应将其运算尽量改到等号右边:select id from t where num=2*100 】

(二)对于索引:
索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,(因为 insert 或 update 时有可能会重建索引)
一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

(三)表的设计
使用varchar代替char(变长字段存储空间小,节省存储空间;在一个相对较小的字段的查询效率较高)
只返回需要查询的字段 而不要使用select*(此时会扫描表中所有的列)
优化group by


关于索引的问题?
什么是索引?
【索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。】

为什么索引能提升效率?
【索引通过事先排好序,在查找时可以应用二分查找等高效率的算法】

什么情况下索引失效?为什么失效?
【%在第一位;在where中使用or且其中一个列非索引;在where中使用!=,<>;在where中使用in/not in,where中'='左边运算;字符型字段为数字时在where条件里不添加引号
此时引擎会放弃使用索引,而改用全表扫描】

like%..%为什么会扫描全表?遵循什么原则?
【因为这样是全模糊查找, 无法使用索引, 所以会扫描全表。
使用了索引的最左原则, 因为索引没生效】

建索引的几大原则?
1、最左前缀匹配原则:
mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。比如a = 1 and b = 2 and c > 3 and d = 4,如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2、=和in可以乱序
比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。
3、尽量扩展索引而不要新建索引
比如表中已经有a的索引,现在要加(a,b)的索引,只需要修改原索引
4、尽量选择区分度高的列作为索引
区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少。

INNODB和MYISAM
SQL优化
数据库中数据结构【b树和hash】
数据库优化

对于mysql数据库来说,索引的使用是很巧妙的。它设置的好可以提高速度,设置的不好不光无法提高速度,还会造成浪费内存空间。在优化方面,
我们首先建立索引,要判断是否需要建立。其次使用的时候,要尽可能避免索引与or,where。。。。。。(此处有至少10条)一起使用。】
数据库锁是怎么实现的

你可能感兴趣的:(数据库知识点)