数据库基础(1)

数据库基础

一、什么是数据库

简单来说,数据库就是用来存储计算机数据的仓库(就和水库是存储水的一样),其存储的本质还是文件,存储在其中的数据按一定数据结构来组织。

1、数据库的特点

(1)数据库依赖数据结构来组织数据,所以数据库十分的条理化。
(2)可以实现结构化查询,方便数据的管理

2、数据库模式的分类

数据库一般分为两类:(1)关系型数据库(mySql) (2)非关系型数据库(redis)

2.1、关系型数据库
2.1.1、什么是关系型数据库

关系型数据库是依赖关系模式来创建的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。简单来说关系型数据库就是利用了选择、投影、连接、并、交、差、除等数学方法来实现输的存储和增删改查的。可以用一个SQL语句在一个表及其多个表之间做非常好的数据查询,安全性高。其中所谓的关系模型就是“一对一”、“一对多”、“多对多”等关系模型。

2.2、非关系型数据库

非关系型数据库简称noSql,主要是基于“非关系模式的数据库”。
非关系型模式有:
(1)列模式:存储的数据是一列一列的。关系数据库以一行作为一个记录,列模式数据库的一列为一个记录。(数据即索引,IO快,主要为分布式数据库,Hbase)。
(2)key-value模式:存储的数据是一个个“键值对”(redis,MemcacheDB)。
(3)文档类模型:以一个个文档来存储数据,有点类似于“键值对”(mongoDB)。

3、关系型数据库和非关系型数据库的比较

(1)nosql数据库部署简单,关系型数据库有些成本比较大。
(2)nosql数据库的数据存储在缓存中,而关系型数据库的数据存储在磁盘中,所以nosql数据库的查询速度高于关系型数据库。
(3)nosql数据库的存储类型可以是基础类型或者是集合等各种格式,而关系型数据库只支持基础类型。
(4)nosql数据库存储的数据没有耦合性,所以扩展性比较高。
(5)nosql数据库不支持SQL语句。
(6)nosql数据库不安全,数据存放在内存中断点容易丢失(redis可以将数据同步写到磁盘中)

二、数据库的基本概念

(1)DB:数据库
(2)DBMS:数据库管理系统(mysql)
(3)SQL:结构化的查询语言

1、索引

概念:是一种为了加快对数据表中数据行的检索从而创建的分散的数据结构。关系型数据库中的索引一般为硬盘级索引。索引的一个主要目的就是加快检索表中数据,也可以协助信息搜索者尽快的找到符合条件的记录ID的数据结构。简单来说索引就是一本书的目录(目录的组织形式为:B+树树),当我们需要查找书中内容时,通过目录查找的速度远高于直接在内容中查找。

1.1.1、 索引的实现方法

(1)B+树索引 (2)哈希索引

1.1.2、 索引越多数据检索的越快?

从上面就可以直到,索引是一种数据结构,维护这个数据结构也是需要消耗一个资源的,而且在数据表需要更新是一般索引也需要更新,而这时更新操作是比较浪费时间的。

2、事务

数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全被执行,要么完全不不执行(如果在执行该事务的过程中发生了错误,那么在这个过程涉及的所有的数据修改将恢复到没有执行该操作的状态)。事务的结束有两种:(1)组成事务的所有操作全部被完成,事务提交。(2)事务中有操作执行失败,事务回滚。事务时数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

2.1、 事务的特性

当一个逻辑工作单元要成为事务,必须满足四个特性:ACID。

2.1.1、 原子性(Atomicity)

事务中包含的操作要么都做,要么都不做。

2.1.2、 一致性(Consistency)

事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。事务前后,数据库的状态都满足所有的完整性约束。

2.1.3、 隔离性(Isolation)

一个事务的执行不能干扰其他事务,即一个事务内部的操作及使用的数据对其他并发事务的隔离的,并发执行的各个事务之间不能相互干扰。

2.1.3.1、 并发事务引起的问题

(1)更新丢失:两个事务同时更新了一行数据,但第二个事务却中途失败退出,导致数据的两个修改都失效了。
(2)脏读:无效的数据读出,一个事务读取另外一个事务还没有进行提交的数据。数据还没有被提交,可能会发生回滚。
(3)不可重复读:在同一事务中,两个相同的查询返回了不同的结果。
(4)幻读:事务在操作过程进程了两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据。在事务a的操作过程中,事务b对数据表进行可增加或删除。

2.1.3.2、 隔离性级别

(1)Read Uncommited(未提交读):最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。已解决:更新丢失
(2)Read Commited(提交读):只要在事务发生提交之后,其更新的结果才会被其他事务看到。已问题:更新丢失、脏读
(3)Repeated Read(可重复读):在一个事务中,对于同一份数据有的读取结果总是相同的,无论是否由其他事务对该数据的操作,以及这个数据的提交。已解决:更新丢失、脏读、不可重复读
(4)Serializtion(可串行化):事务串行执行,隔离级别最高,牺牲了系统的并发性。可以解决所有的问题。

2.1.4、 持续性(Duration)

事务一旦被提交,那么数据库中的数据改变就是永久性的,即便是数据库系统遇到故障的情况下也不会丢失提交事务的操作。

3、锁及锁的粒度

为什么需要锁:为了保证数据的一致性。mySql各存储引擎中使用了三种级别的锁定机制:表级锁定、行级锁定和页级锁定。
锁的粒度:锁定的数据量,数据量越小,锁的粒度越小,并发程序越高,但相应的加锁,检测锁、释放锁的系统开销也越大。

3.1、表级锁定

表级锁一次会将整个表锁定,所以可以很好的避免死锁的问题。
(1)锁的粒度大,锁冲突的概率高,并发度低。
(2)不会出现死锁,开销小,获取锁和释放锁的速度很快。
(3)适用于以查询为主、少量更新的情景。

3.2、 行级锁定

行级锁一次对一行数据(记录)加锁,开销大,并发程度高。
(1)锁的粒度小,发生锁冲突的概率低、并发度高。
(2)开销大,加锁慢,容易发生死锁。
(3)适用于对事务完整性要求较高的系统。

3.3、 页级锁定

(1)介于行级锁和表级锁之间
(2)会发生死锁

3.4、 锁的种类

共享锁、排他锁、乐观锁、悲观锁、死锁
其中共享锁和排它锁是真正的锁;乐观锁和悲观锁都是一种策略;死锁是并发是的一种现象。

3.4.1、 共享锁和排他锁

(1)共享锁(读锁):在同一时间段内,多个用户可以读取统一资源,读取的过程中数据不会发生任何变化。读锁之间相互不阻塞,多个用户可以同时读,但是不能修改,和排它锁互斥。即:
一个资源一旦加上共享锁(直到共享锁释放),就不能加排它锁,但可以加其他的共享锁。
(2)排它锁(写锁):在同一时间只允许一个用户对资源进行修改,写锁会阻塞其他锁。即:
一个资源一旦加上排它锁,就不能再加其他任何锁,其他用户对该资源既不能读也不能写,直到排它锁释放。

3.4.2、乐观锁和悲观锁

乐观锁和悲观锁都是为了解决并发控制的问题。乐观锁是一种在最后提交时检测冲突的手段,而悲观锁则是一种避免冲突的手段
(1)乐观锁(Optimistic Lock)
每次获取数据的时候,都不会担心数据被修改,所以每次获取的数据的时候都不会加锁,但是在更新数据的时候需要判断该数据释放被别人修改过,如果数据被其他线程修改过,则不进行数据更新,如果数据没有被其他线程修改,则进行数据的更新。虽然提高了并发量,但是无效的操作可能到最后才能被检测出来。
乐观锁是不加锁的
(2)悲观锁(Pessimistic Lock)
每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中别的线程不会修改,自己使用完成之后对该数据进程解锁。虽然降低可并发量,但是可以保证操作的有效性。
读取频繁使用乐观锁,写入频繁使用悲观锁

三、mySql

1、MySql的引擎

1.1 什么是数据库引擎

数据库引擎是用于存储、处理和保护数据的核心服务。
利用数据引擎可以控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。最常用的是InnoDB和MyIsam。

1.1.1、InnoDB(5.5以后默认存储引擎)

InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。innoDB引擎提供了对数据库ACID(原子性、一致性、隔离性、持久性)事务的支持,并实现了SQL标准的四种隔离级别,它设计的目标是处理大容量数据库系统。InnoDB的索引(B+树)采用的是聚合索引— 索引文件就是数据文件本身(减少了寻址次数)。

1.1.2、MyIsam(5.5以前默认存储引擎)

和InnoDB不同的是,MyIsam没有提供对事务的支持,也不支持行级锁和外键,因此当插入和更新数据需要锁定整个表,效率会低一些。但MyIsam引擎独立于操作系统,可以通过一些简单的操作将数据转移到其他系统上去。MyIsam的索引(B+树)采用的非聚合索引—其索引和实际数据是分开的,数据域存储的是实际的数据的地址,通过地址再次寻址实际的数据。

1.1.3、InnoDB和MyIsam的区别

(1)事务:MyIsam不支持事务处理等高级处理;inonDB支持事务、行级锁定和外键等高级处理。
(2)性能:MyIsam强调的是性能,其执行速度比InnoDB类型更快。
(3)行数保存:MyISam会保存整表的行数,而InnoDB不会。即在执行select count() from table;(统计表的行数) 时,InnoDB会扫描全表来计算有多少行,而MyISam可以直接读取保存的行数。但是进行条件查询时两者都需要扫描统计。
(4)索引存储:MyISam采用的时非聚合索引,并且支持全文索引和压缩索引。
(5)服务器数据备份:InnoDB的数据必须导出SQL来备份,而MyIsam的数据本身就是文件的形式存储的。在跨平台转移上很方便。
(6)锁的支持:MyIsam只支持表锁;InnoDB支持表锁,行锁。

1.1.4、 如何选择数据库引擎

InnoDB:
(1)需要支持事务处理(银行)。
(2)需要实现并发控制(售票)。
(3)频繁的更新、删除操作。
MyISam:
(1)频繁的插入和查询操作。
(2)需要许多count计算的。
如果不清楚选择是什么数据库引擎,那么InnoDB总是不会错的。
在同一个数据库中,不同的表也可以选择不同的数据库引擎,可以根据每一个表的特点对数据库引擎做出最合适的选择。

1.1.5、 查看数据库引擎

(1)查看mySql支持那些引擎
show engines;

mySql支持引擎

(2)查看默认的引擎
show variables like ‘%storage_engine%’;

mySql默认的引擎

2、MVCC(多版本并发控制)

MVCC(Mutil-Version Concurrency Control,多版本并发控制)是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。
MVCC是一种多版本并发控制的机制,是Mysql的InnoDB存储引擎实现隔离级别的一种具体方法,用于实现提交读和可重复读这两种隔离级别。MVCC是通过保存数据在某个时间点的快照来实现该机制,其在每行记录后面保存两个隐藏的列,分别保存这个行的创建版本号和删除版本号。InnoDB的MVCC使用的快照存储在undo日志中,该日志通过回滚指针把一个数据行的所有快照连接起来。

2.1 MVCC是什么

MVCC类似于锁机制,但其比单纯的锁更加高效。
MVCC:是一种提高的并发的技术,最早的数据库系统中,只有读读之间可以并发,读写,写读,写写都需要阻塞。在引入MVCC之后,只有写写阻塞,其他三种操作都可以并发,这样大幅度的提高了InnoDB的并发度。
(1)MVCC被Mysql中事务型存储引擎InnoDB所支持。
(2)应对高并发事务,MCVV比单纯的锁更加高效。
(3)MVCC只能在Read_Commited(提交读)和Repeatable_Read(可重复读)
两个隔离级别下工作。
(4)MVCC可以使用乐观锁和悲观锁来实现。
(5)由于没有同一的标准,所以各个数据库系统的实现的MVCC机制都不尽相同。
虽然可以简单的将MVCC看作是行级锁的一个变种,但MVCC在很多情况下避免了加锁的操作。

3、mySQl和Redis的区别

**MySql:**属于关系型数据库,所以的数据都存储在磁盘中,可以兼容不同的系统,方便操作转移而且支持大部分的SQL查询语句,支持数据备份,持久化存储,支持复杂的查询语句,但是每次对数据进行检索的时候就会涉及到磁盘的IO操作,这样就降低了运行的速度。
**Redis:**属于noSql(内存数据库),所以的数据都存储在内存中,执行增删改查的速度比MQSql快速很多,这大大的提升了高数据量WED访问的速度,一般高并发(秒杀系统)都是redis实现的。但是由于数据存储在内存中这样存在两个问题;(1)内存中的数据断电会丢失;(2)内存的容量有限,无法存储大量的数据。
所以,一般是MySql(主)和Redis(辅)配合使用,将数据缓存到内存中,web访问的时候会优先访问redis,若是未查询到则去mySql中查询,然后将该数据缓存到内存中,方便下次查询,从而提高项目的整体性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值