数据库

作者: 陈子晞CZX | 来源:发表于2019-03-07 21:59 被阅读0次

一、数据库三范式

1NF:数据表的每一列都是原子的,即列不能再细分为更小的列。

2NF:在1NF的基础上,要求表有主码,且非主码列必须完全依赖于主码列。

3NF:在2NF的基础上,要求非主码列必须直接依赖于主码列。

补充:BCNF,在3NF的基础上,要求主码列不能部分或间接依赖于主码。

二、数据库索引

概念

数据库索引是一种对数据表中一列或者多列排序的结构,使用索引可以快速查找特定信息。

分类

普通索引:基本索引,没有限制。

唯一索引:要求索引列的取值是唯一的,但可以为Null。

主键索引:建立在主码上的索引(数据表默认都会为主码建索引)。

组合索引:多列构成的索引,遵循最左前缀原则。

全文索引:fulltext,只能在char,varchar,text上建立全文索引,用于查找文本中的关键字

优缺点

优点:加快查询速度;加快表连接速度;加快查询中分组和排序的速度。

缺点:占用物理空间;增删改时需要同时维护索引,降低了这些操作的速度。

使索引失效的操作

1、列的取值存在Null,例如a为索引,使用语句a is null会使索引失效,但是a = "12"是不会的(单列索引不匹配null值,复合索引不匹配全为null的值)。2、where中使用not in 或者 <> 。3、在列上进行计算。4、“%ab”这样的like语句,而“ab%”是可以使用索引的。5、尽量不要使用select *,因为会导致覆盖索引不可用。

B+树

是MySQL数据库的索引的底层实现,具体的B+树的实现就不介绍了。好处是命中稳定;更新和查询都很快;数据都存在叶节点,且以链表的形式有序排列。

三、数据库索引引擎

四、数据的四大特性

ACID

原子性(Atomicity):事务的所有操作要么都执行成功,要么都不成功。

一致性(Consistency):事务必须使数据库从一个一致性状态变成另一个一致性状态。

隔离性(Isolation):当存在并发用户同时访问数据库时,并发事务之间相互隔离,互不影响。

持久性(Durability):事务操作一旦提交,它对数据库的修改就是永久性的。

五、数据库的隔离级别及其实现

要谈论数据库的隔离级别,首先得说说在读取数据库数据时,可能出现的问题。

问题一:脏读

事务B正在修改数据d,此时事务A读取数据d,最后B回滚了,那么A得到的数据就是脏数据。

问题二:不可重复读

事务A在循环读取数据d,此时,事务B修改数据d并提交了,下一次A读取数据时,发现前后读取的不一样,所以重复读取的数据不一致,出现不可重复读问题。

问题三:幻读

事务A正在将表t中的数据字段年龄全部改成15,此时事务B向表中插入一条数据,且年龄为10,操作成功提交。当事务A检查表t的数据时,发现存在未被修改的数据行。此时发生幻读。

针对以上问题,数据库有四种对应的隔离级别

级别一:读取未提交(Read Uncommitted)

会发生脏读、不可重复的、幻读

锁实现:事务在读数据的时候并未对数据加锁。事务在修改数据的时候只对数据增加行级共享锁。

级别二:读取已提交(Read Committed)

会发生不可重复读、幻读

锁实现:事务在读数据的时候对数据加行级共享锁,读取结束立即释放锁。事务在修改数据时对数据加行级排他锁,直到整个事务结束。

级别三:可重复读(Repeatable Read)

会发生幻读

锁实现:事务在读数据的时候对数据加行级共享锁,直到整个事务结束。事务在修改数据时对数据加行级排他锁,直到整个事务结束。

级别四:可串行化(Serializable)

锁实现:事务在读数据的时候对数据加表级共享锁,直到整个事务结束。事务在修改数据时对数据加表级排他锁,直到整个事务结束。

数据库锁说明

行级锁:对某行数据加锁。

表级锁:对整个表加锁。

共享锁(读锁):允许其他事务读(加读锁),但是不许其他事务写(加写锁)

排他锁(写锁):不许其他事务读或写。

六、数据库连接池

为了避免每次访问数据库都要重新建立连接,可以为数据库建立连接池。

连接池有个最小连接数,当需要连接时,直接返回池中的连接对象。当请求超过最小连接数时,会建立新的连接,直到达到最大连接数。此时,后来的数据库连接请求就会到队列中等待。

超过最小连接数的连接在使用完之后不会立即释放,而是等待被重复使用,或者超过指定时间被释放。

自定义实现数据库连接池,需要实现DataSource接口,其中需要考虑的关键问题是不能直接将连接对象返回给用户,因为这样他就可以通过连接对象的close()方法直接关闭连接了,所以得使用装饰模式封装连接对象,重写close()方法。

七、MySQL数据库优化

(1)根据服务层面:配置mysql性能优化参数;

(2)从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。

(3)从数据库层面增强性能:优化SQL语句,合理使用字段索引。

(4)从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。

(5)减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。

(6)不常使用的数据迁移备份,避免每次都在海量数据中去检索。

(7)提升数据库服务器硬件配置,或者搭建数据库集群。

(8)编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤);

八、表的连接

连接类型

inner join        left outer join        right outer join        full outer join

区别:内连接不会保留不具有相同列的行。而外连接会(left只保留出现在左表不出现在右表的行,right只保留出现在右表不出现在左表的行,full都保留)。

连接条件

natural        on        using

区别:natural对于相同取值的列只保留一次;on对相同取值的列会保留两次,同时on还可以跟其他谓词,功能相当于where语句;using可以指定匹配的列。

使用方式

通过将连接类型和连接条件进行组合,可以得到不同的表连接方式。

例如:natural inner join,left outer join...on...,join...using...

相关文章

  • MySQL数据库day01

    系统数据库 ​​​ 创建数据库 ​​​ ​​​ ​​​ ​​​ 查看所有数据库 使用数据库 修改数据库 删除数据库...

  • 数据库操作

    创建数据库: 选择数据库: 查看数据库: 修改数据库: 删除数据库:

  • Ubuntu操作mysql数据库命令

    一、连接数据库 连接本地数据库 退出数据库 二、操作数据库 创建数据库 显示数据库 删除数据库 连接数据库 查看状...

  • 4-14

    创建数据库 createdatabase数据库名称; 删除数据库 dropdatabase数据库名称; 查看数据库...

  • [后端开发] Mysql学习笔记

    1.0 数据库 创建数据库 查看所有数据库 删除数据库 切换数据库名 查看正在使用的数据库 2.0 数据库表 创...

  • 2020最新最全数据库系统安全

    数据库标识与鉴别 数据库访问控制 数据库安全审计 数据库备份与恢复 数据库加密 资源限制 数据库安全加固 数据库安...

  • 2020-01-05 sql基本概念

    数据库用来储存数据。 数据库的种类大致有:层次数据库、关系数据库、面向对象数据库、XML数据库、键值数据库。 关系...

  • Mysql数据库基本操作

    连接数据库 退出数据库 查看数据库版本 显示数据库时间 查看当前使用的数据库 查看所有数据库 数据库备份 导入数据...

  • mysql命令行操作

    准备 登陆 数据库操作 查看现有数据库 创建数据库 删除数据库 查看数据库 使用数据库 查看当前数据库 表操作 新...

  • 1.7.1 MySQL数据库学习

    1. 数据库命令行学习 进入数据库 创建数据库 查看数据库列表 删除数据库 使用数据库 查看当前数据库 2. 表 ...

网友评论

    本文标题:数据库

    本文链接:https://www.haomeiwen.com/subject/recvuqtx.html