剑指Offer——知识点储备-数据库基础

剑指Offer——知识点储备-数据库基础

数据库

事务

事务的四个特性(ACID):

??原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

- (1)原子性

整个事务中的所要操作要么全部提交成功,要么全部失败回滚。

- (2)一致性

保证数据库中的数据操作之前和操作之后的一致性。(比如用户多个账户之间的转账,但是用户的总金额是不变的)

- (3)隔离性

隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其它事务是不可见的。(即事务之间要串行执行)

在SQL标准中定义了四种隔离性:(下面隔离性是由低到高,并发性由高到低)

  • 1)未提交读 最低的隔离等级,允许其他事务看到没有提交的数据,会导致脏读。
  • 2)已提交读

    由于数据库是读写分离,事务读取的时候获取读锁,但是在读完之后立即释放,释放读锁之后,就可能被其他事务修改数据,再进行读是就发现前后读取数据的结果不同,造成不可重复读。(读锁不需要事务提交后释放,而写锁需要事务提交后释放)

  • 3)可重复读

    所有被select获取的数据都不能被修改,这样就可以避免一个事务前后读取不一致的情况。但是没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据;

  • 4)可串行化

    所有事务一个接着一个执行,这样可以避免幻读,对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询的时候,需要获取范围锁,如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需回滚该事务。

  • 总结:四个级别逐渐增强,每个级别解决问题,事务级别越高,性能越差,大多数环境下(read committed就可以用了)

隔离级别????????????脏读??不可重复读??幻读

未提交读(read uncommitted)?可能??可能?????可能

已提交读(read committed)?不可能??可能?????可能

可重复读(repeatable read)?不可能 ?不可能?????可能

可串行化(serializable)???不可能??不可能????不可能

  • 总结:未提交读会造成脏读—>已提交读解决脏读,但会造成不可重复读—>可重复读解决读取结果前后不一致的情况,但是造成幻读(以前没有,现在有)—>可串行化解决了幻读,但是增加很多范围锁,可能会造成锁超时;
  • (4)持久性 一旦事务提交,则其所做的修改就会永久保存到数据库中,此时即使系统崩溃,已提交的修改数据也不会丢失。

脏读、不可重复读和幻读

  • (1)脏读(针对回滚的操作):事务T1更新了一行记录的内容,但是并没有提交所做的修改,事务T2读取更新后的行,然后T1执行了回滚操作,取消了刚才所做的修改。现在T2读取的行数就无效了(一个事务读取了另一个事务);
  • (2)不可重复读(针对修改的操作):事务T1读取了一行记录,紧接着T2修改了T1刚才读取的那一行记录,然后T1又再次读取这行记录,发现与刚才读取的结果不同。
  • (3)幻读(针对更新的操作):事务T1读取一条指定的where子句所返回的结果集,然后T2事务新插入一行记录,这行记录恰好可以满足T1所使用的查询条件。然后T1再次对表进行检索,但又看到了T2插入的数据。(第一次没看到,第二次看到了)

索引

2.1 数据库索引的优缺点以及什么时候数据库索引失效?

索引的特点

(1)可以加快数据库的检索速度;

(2)只能创建在表上,不能创建到视图上;

(3)既可以直接创建又可以间接创建;

(4)可以在优化隐藏中使用索引;

(5)使用查询处理器执行sql语句,在一个表上,一次只能使用一个索引。

索引的优点

(1)创建唯一性索引,保证数据库表中每一行数据的唯一性;

(2)大大加快数据的检索速度,这是创建索引的最主要原因;

(3)加速数据库表之间的链接,特别是在实现数据库的参考完整性方面特别有意义;

(4)在使用分组和排序子句进行检索时,同样可以显著减少查询中分组和排序的时间;

(5)通过使用索引,可以在查询中使用优化隐藏器,提高系统的性能;

索引的缺点

(1)创建索引和维护索引要耗费时间,这种时间随着数量的增加而增加;

(2)索引需要占用物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,如果建立聚集索引,那么需要的空间就会更大;

(3)当对表中的数据进行增加、删除和修改的时候,索引也需要维护,降低数据维护的速度;

索引分类

(1)普通索引(它没有任何限制。)

(2)唯一性索引(索引列的值必须唯一,但允许有空值。)

(3)主键索引(一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。)

(4)组合索引

(5)聚集索引 按照每张表的主键构造一颗B+树,并且叶节点中存放着整张表的行记录数据,因此也让聚集索引的叶节点成为数据页。

(6)非聚集索引(辅助索引)(页节点不存放一整行记录)。

索引失效

(1)如果条件中有or,即使其中有条件带索引,也不会使用(尽量少用or);

(2)Like查询是以%开头,例如SELECT * FROM mytable WHEREt Name like’%admin’;

(3)如果列类型是字符串,那一定要在条件中使用引号引起来,否则不会使用索引;

各引擎支持索引:(核心弄懂B-Tree索引)

MyISAM,InnoDB,Memonry三个常用MySQL引擎类型比较

索引???MyISAM索引???InnoDB索引???Memonry索引

B-tree索引??支持??????支持??????支持

Hash索引 ??不支持?????不支持?????支持

R-Tree索引??支持?????不支持?????不支持

Full-text索引?不支持????暂不支持?????不支持

数据库中的索引结构?什么情况下适合建索引?

数据库中的索引结构?

??因为在使用二叉树的时候,由于二叉树的深度过大而造成I/O读写过于频繁,进而导致查询效率低下。因此采用多路树结构,B树的各种操作能使B树保持较低的高度。

??B树又叫平衡多路查找树,一棵m阶的B树特性如下:

- 1.树中每个结点最多含有m个孩子(m>=2);

- 2.除根结点和叶子结点外,其他每个结点至少有(ceil(m/2))个孩子(其中ceil(x)是一个取上限的函数);

- 3.根结点至少有2个孩子(除非B树只包含一个结点:根结点);

- 4.所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部结点或查询失败的结点,指向这些结点的指针都为null);(注:叶子结点只是没有孩子和指向孩子的指针,这些结点也存在,也有元素,类似红黑树中,每一个null指针即当做叶子结点,只是没画出来而已)

B+树

在什么情况下适合建立索引?

(1)为经常出现在关键字order by, group by, distinct后面的字段,建立索引;

(2)在union等集合操作的结果集字段上建立索引,其建立索引的目的同上;

(3)为经常用作查询选择的字段,建立索引;

(4)在经常用做表链接的属性上,建立索引;

(5)考虑使用索引覆盖,对数据很少被更新的表,如果用户经常只查询其中的几个字段,可以考虑在这几个字段上建立索引,从而将表的扫描改变为索引的扫描。

Mysql语法顺序

即当sql中存在下面的关键字时,它们要保持这样的顺序:

select[distinct]、from、join(如left join)、on、where、group by、having、union、order by、limit;

Mysql执行顺序

?即在执行时sql按照下面的顺序进行执行:

from、on、join、where、group by、having、select、distinct、union、order by

?group by要和聚合函数一起使用,例如:

select a.Customer,sum(a.OrderPrice) from orders a where a.Customer=’Bush’ or a.Customer = ‘Adams’ group by a.Customer

实现多表查询(内连接)

select u.uname,a.addr from lm_user u inner join lm_addr a on u.uid = a.uid;

使用select from where同样可以实现

select u.uname,a.addr from lm_user u, lm_addr a where u.uid = a.uid;

存储过程

delimiter

createprocedureprocedurebill()comment′查询所有销售情况′beginselectbillid,txtime,amtfromlmbill;end

delimiter ;

调用存储过程

call procedure_bill();

查看存储过程

show procedure status like ‘procedure_bill’;

在MySQL数据库建立多对多的数据表关系

??在数据库中,如果两个表的之间的关系为多对多的关系,如:“学生表和课程表”,一个学生可以选多门课,一门课也可以被多个学生选;根据数据库的设计原则,应当形成第三张关联表。

步骤1:创建三张数据表Student ,Course,Stu_Cour

/**学生表*/
CREATE TABLE Student (
stu_id INT AUTO_INCREMENT,
NAME VARCHAR(30),
age INT ,
class VARCHAR(50),
address VARCHAR(100),
PRIMARY KEY(stu_id)
)
/*学生课程表*/
CREATE TABLE Course(
cour_id INT AUTO_INCREMENT,
NAME VARCHAR(50),
CODE VARCHAR(30),
PRIMARY KEY(cour_id)
)
/**学生课程关联表*/
CREATE TABLE Stu_Cour(
sc_id INT AUTO_INCREMENT,
stu_id INT ,
cour_id INT,
PRIMARY KEY(sc_id)
)

第二步:为Stu_Cour关联表添加外键

/*添加外键约束*/
ALTER TABLE Stu_Cour ADD CONSTRAINT stu_FK1 FOREIGN KEY(stu_id) REFERENCES Student(stu_id);
ALTER TABLE Stu_Cour ADD CONSTRAINT cour_FK2 FOREIGN KEY(cour_id) REFERENCES Course(cour_id);

完成创建!

  • 注:为已经添加好的数据表添加外键:

    -语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名); 例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id);

SQL优化

NO SQL 数据库

常用的数据库有哪些?Redis用过么?

常用的关系数据库:

Mysql、SQLServer、Oracle

常用的无模式数据库:

MongoDB, Merncached,redis……

Redis

(1)Redis是一个速度非常快的非关系数据库,可以存储键(Key)与5种不同类型的值(value)之间的映射,可以将存储在内存中的键值对数据持久化到硬盘中。

(2)与Merncached相比

1)两者都可以用于存储键值映射,彼此性能也相差无几;

2)redis能够自动以两种不同的方式将数据写入硬盘;

3)redis除了能存储普通的字符串键之外,还可以存储其他4种数据结构,merncached只能存储字符串键;

4)redis既能作主数据库,也可以作为其他存储系统的辅助数据库;

数据库引擎(存储引擎)

引擎是什么?

??当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是通过数据库引擎去访问数据库文件。

??以关系型数据库为例,你发SQL语句给数据库引擎,数据库引擎解释SQL语句,提取出你需要的数据返回给你。因此,对访问者来说,数据库引擎就是SQL语句的解释器。

MYISAM和InnoDB引擎的区别

主要区别:

- (1)MYISAM 是非事务安全型的,而InnoDB是事务安全型;

- (2)NYISAM锁的粒度是表级锁,而InnoDB支持行级锁;

- (3)MYISAM支持全文本索引,而InnoDB不支持全文索引

- (4)MYISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MYISAM;

- (5)MYISAM表是保存成文件的形式,在跨平台的数据转移中使用MYISAM存储会省去不少的麻烦;

- (6)InnoDB表比MYISAM表更安全,可以在保证数据不丢失的情况下,切换非事务表到事务表;

应用场景:

- (1)MYISAM管理非事务表,它提供高速存储和检索,以及全文搜索能力,如果应用中需要执行大量的select查询,那么MYISAM是更好的选择。

- (2)InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的insert或update操作,则应该使用innodb,这样可以提高多用户并发操作的性能。

其他

数据库中的范式有哪些

??目前关系数据库有6种范式:第一范式{1NF},第二范式{2NF},第三范式{3NF},巴斯—科德范式{BCNF},第四范式{4NF},第五范式{5NF,又称完美范式}。满足最低要求的范式是第一范式。在第一范式的基础上进一步满足更多规范要求的称为第二范式{2NF},其余范式依次类推,一般来说,数据库只需满足第三范式(3NF)就OK了。

范式:

  • (1)1NF:确保每列保持原子性;
  • (2)2NF:确保表中的每列都和主键相关(联合主键);
  • (3)3NF:确保表中的每列都和主键直接相关(外键);
  • (4)BCNF:在1NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖);
  • (5)4NF:要求把同一表内的多对多关系删除;
  • (6)5NF:从最终结构重新建立原始结构;

时间: 2024-10-26 02:42:36

剑指Offer——知识点储备-数据库基础的相关文章

剑指Offer——当当+搜狐+好未来笔试题+知识点总结

剑指Offer--当当+搜狐+好未来笔试题+知识点总结 情景回顾 时间:2016.9.21 15:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:当当笔试.搜狐笔试.好未来笔试 3场笔试中好未来相对简单点. 好未来编程题 马踏棋盘(贪心算法) ??马踏棋盘是经典的程序设计问题之一,主要的解决方案有两种:一种是基于深度优先搜索的方法,另一种是基于贪婪算法的方法.第一种基于深度优先搜索(DFS)的方法是比较常用的算法,深度优先搜索算法也是数据结构中的经典算法之一,主要是采用递归的

剑指Offer名企面试官精讲典型编程题pdf

下载地址:网盘下载 <剑指Offer:名企面试官精讲典型编程题(第2版)>剖析了80个典型的编程面试题,系统整理基础知识.代码质量.解题思路.优化效率和综合能力这5个面试要点.<剑指Offer:名企面试官精讲典型编程题(第2版)>共分7章,主要包括面试的流程,讨论面试每一环节需要注意的问题:面试需要的基础知识,从编程语言.数据结构及算法三方面总结程序员面试知识点:高质量的代码,讨论影响代码质量的3个要素(规范性.完整性和鲁棒性),强调高质量代码除完成基本功能外,还能考虑特殊情况并对

剑指Offer——如何做好自我介绍

剑指Offer--如何做好自我介绍 前言 自我特点+经历梳理 ??各位老师好,我叫某某某,研究生三年级,就读于某某大学信息科学与工程学院软件工程专业.主要使用的开发语言是Java,熟悉基本数据结构和基本算法实现:熟悉MySQL数据库:掌握Linux基本操作命令:所参与的主要项目有"立马送药","鲜花礼品网","基于Android实现的购彩系统"和"我看看"购物分享Android APP.其中,"立马送药"的

【剑指offer】旋转数组的最小数字

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 分析描述: 求一个数组中的最小值,最简单的办法就是逐个比较数组中各个元素的值,遍历完整个数组,即可得数组中最小元素.但这种方法存在的问题是时间复杂度为O(n). 利用题目中给出的条件:递增排序数组的旋转.利用递增排序的特点,可以用二分查找方法实现时间复杂度为O(logn)的查找.

最大子列和问题(剑指offer和PAT)

01-复杂度1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N_1N?1??, N_2N?2??, ..., N_KN?K?? },“连续子列”被定义为{ N_iN?i??, N_{i+1}N?i+1??, ..., N_jN?j?? },其中 1 \le i \le j \le K1≤i≤j≤K.“最大子列和”则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编

剑指offer (2) c++实现singleton模式

转自:http://www.jellythink.com/archives/82 问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志.那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的.在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可以用了,是的,不错.但是

170319 剑指offer 1.把一个字符串转化成整数(简单问题的全面性考虑)

工作的时间越长,越感觉基础的重要性,当我们对程序的框架结构越来越熟悉的时候,越会注意这一点,在工作当中,功能的实现是重要的,但是代码的健壮性,重用性,与扩展性确往往更为重要,在学习新技术的同时,我们或许应该抽出一点时间,去思考代码可能出现的问题. 关于剑指offer的这本书,可能所有刚毕业找工作的人,或者准备找工作的人都曾经看过,但是当时我们面对一些东西的时候心情过于浮躁,往往忽视了简单的却又十分重要的环节,(ps:也可能只有我是这样) 面试中一道简单的问题(把一个字符串转化成整数) 可能接触c

【剑指offer】整数中1出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27563485 题目描写叙述: 亲们!! 我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包括1的数字有1.10.11.12.13因此共出现6次,可是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题

剑指Offer——银行考试

剑指Offer--银行考试 网申简历 一. 银行网申简历主要看哪些方面? 1.职业形象(30%),基本体现为证件照: 2.学校+成绩+校内表现(40%),体现为证书,成绩排名以及任职经历等: 3.校外实践(20%),主要体现在工作实习.实践活动和培训经历三点: 4.其他(10%),根据简历的完整性.准确性,进行综合评定. 二.网申简历应注意哪些方面? 1.考虑银行人的思维习惯(考虑岗位匹配度) 例:申请职位为柜员时,就应该在简历中体现出热情.乐于帮助他人.沉稳细心.认真大方,具有服务意识且对数字