数据库

Posted tyson03

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库相关的知识,希望对你有一定的参考价值。

数据库特性(ACID)

①原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
②一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
③隔离性是当多个用户并发访问数据库时,多个并发事务之间要相互隔离。
④持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

数据库事务隔离级别

①脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
②不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
③幻读(虚读)是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,就好像产生幻觉一样,这就是发生了幻读。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是某个数据整体。

mysql数据库为我们提供的四种隔离级别:
① Serializable (串行化):读取每一行都会加锁,会导致大量超时和锁争用的问题,可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

mysql索引

索引是存储引擎用于提高数据库表的数据访问速度的一种数据结构(最常见的是B-Tree)。

特点:

避免进行数据库全表的扫描,大多数情况,只需要扫描较少的索引页和数据页
可以提升查询语句的执行效率,但降低了新增、删除操作的速度,同时也会占用额外的存储空间。

索引分类

唯一索引:索引列中的值必须是唯一的,但是允许为空值。
主键索引:是一种特殊的唯一索引,不允许有空值。
组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。
全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。
空间索引:空间索引是对空间数据类型的字段建立的索引,空间索引必须使用MyISAM引擎

乐观锁悲观锁

乐观锁假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查有没有其他事务修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。乐观锁多用于数据争用不大、冲突较少的环境中。
乐观锁的一种实现方式-CAS(比较并交换)。CAS 操作中包含三个操作数 —— 需要读写的内存位置(V)、进行比较的预期原值(A)和拟写入的新值(B)。如果内存位置V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B。否则不更新。最后会返回该位置的值。(冲突检查+数据更新)

悲观锁在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制。悲观并发控制主要用于数据争用激烈的环境。
synchronized 是悲观锁。

存储引擎

InnoDB

InnoDB是mysql默认的事务型存储引擎,使用最广泛,基于聚簇索引建立的,支持热备份,InnoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。InnoDB引入了行级锁和外键约束。缺点是占用的数据空间相对较大。
适用场景:一般来说,如果需要事务支持,并且有较高的并发读写频率,InnoDB是不错的选择。

MyISAM

MyISAM不支持事务和行级锁,不支持崩溃后的安全恢复,也不支持外键,不过它访问速度快,如果对事务完整性没有要求可以使用这个引擎来创建表。

MEMORY

MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。

sql优化

https://blog.csdn.net/jie_liang/article/details/77340905

mysql的锁

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

意向锁是表级锁,但是却表示事务正在读或写某一行记录,而不是整个表。当事务A对表t的某些行修改,需要对t加上意向排它锁,在A事务完成之前,B事务来需要全表操作,此时直接在表级别的意向排它锁就能告诉B需要等待,而不需要再去行级别判断。

索引失效

1.如果条件中有or(要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引)
2.对于多列索引,不是使用的第一个索引列,则不会使用索引
3.like查询是以%开头
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.对索引字段判断是否为NULL时。is null 或is not null。
6.判断索引列是否不等于某个值时
7.对索引列进行运算。

分库分表

垂直划分数据库是根据业务进行划分,例如将shop库中涉及商品、订单、用户的表分别划分出成一个库,通过降低单库的大小来提高性能,但这种方式并没有解决高数据量带来的性能损耗。同样的,分表的情况就是将一个大表根据业务功能拆分成一个个子表,例如用户表可根据业务分成基本信息表和详细信息表等。
优点:拆分后业务清晰,达到专库专用;便于维护
缺点:不解决数据量大带来的性能损耗,读写压力依旧很大;不同的业务无法跨库关联(join),只能通过业务来关联

?水平划分是根据一定规则,例如时间或id序列值等进行数据的拆分。比如根据年份来拆分不同的数据库。每个数据库结构一致,但是数据得以拆分,从而提升性能。
优点:单库(表)的数据量得以减少,提高性能;提高了系统的稳定性和负载能力;切分出的表结构相同,程序改动较少
缺点:数据分片在扩容时需要迁移;维护量增大;无法跨库关联

以上是关于数据库的主要内容,如果未能解决你的问题,请参考以下文章

数据库类型——系统数据库/用户数据库

关系型数据库与文档型数据库的差别?

数据库数据库管理系统数据库系统

mysql数据库的基本操作:创建数据库查看数据库修改数据库删除数据库

如何清理mysql数据库缓存数据?

JDBC访问数据库的步骤