Mysql基础
- 数据库事务的四个特性和含义
- 原子性:事务的所有操作要么全部完成,要么全部不完成。
- 一致性:在开始之前和结束以后,数据库完整性约束没有破坏。
- 隔离性:隔离状态执行任务,像是在系统给定时间内执行唯一操作,这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
- 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
- 数据库范式
- 第一范式: 数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
- 第二范式: 数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码,要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
- 第三范式:要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,第三范式就是属性不依赖于其它非主属性。
- 数据库优化
- SQL语句优化
- 避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
- 避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。可以在num上设置默认值0,确保表中num列没有null值,然后这样查询。
- 用 exists 代替 in 是一个好的选择。
- 用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤。
- 索引优化
- 数据结构优化
- 范式优化:比如消除冗余节省空间。
- 反范式优化:比如适当加冗余等(减少join)
- 拆分表: 分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。
- innodb和myisam的区别
- Innodb支持事务,myisam不支持
- Innodb支持行级锁,myisam不支持
- Innodb支持MVCC,myisam不支持
- Innodb支持外键,myisam不支持
- myisam支持全文搜索,Innodb不支持
- 索引
- 索引优点
- 快速访问数据表中的特定信息,提高检索速度。
- 创建唯一性索引,保证数据库表中每一行数据的唯一性。
- 加速表和表之间的连接。
- 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
- 索引缺点
- 创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加。
- 不光是表需要占用数据空间,每个索引也需要占用物理空间。
- 当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
- 什么情况下不宜建索引
- 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
- 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。
- 存储过程
- 含义:存储过程是一些编译好的SQL语句,系统在调用SQL的时候比较浪费时间,所以之前先将一些基本的额SQL语句代码进行编译(对单表或多表的增删改查),然后再给代码取一个名字,在需要这个功能时去调用它就可以了。
- 优点:
- 是编译后的代码 效率高。
- 代替SQL语句,降低网络通信。
- 在一定的程度确保数据安全。
- 缺点
- 架构不清晰,不够面向对象。
- 开发和维护要求比较高。
- 可移植性差。
- 乐观锁和悲观锁
- 根据不同类型可以对数据设置不同的锁权限。
- 乐观 悲观 锁 主要是作用在并发访问控制。
- 悲观锁 假定会发生并发冲突,屏蔽任何违反数据完整的操作。
- 乐观锁 假定不会发生冲突,只有在提交操作时检查是否违反数据的完整性。