1.事务
事务是数据库中一个单独的执行单元。单元中每个sql语句都是互相依赖的,任何一句执行失败整个单元都会回滚,回到最初的状态。
- 事务的四大特性(ACID):
- 原子性:事务包含的所有操作要么全成功,要么全失败回滚。
- 一致性:事务执行前后都必须处于一致性状态(如ab共五百块,不管怎么交换,最终钱加起来还是500块)
- 隔离性:多个并发事务之间要相互隔离开(如两个事务,对于1来说,2要么在1开始之前开始,要么在1结束后开始)
- 持久性:数据的变化是永久性的
- 事务隔离级别:读未提交、读已提交、可重复读、串行化。
2.查询的数据很多,怎样提高查询效率
- 数据库设计方面
建立索引、分区、选取最适用的字段属性(减少字段宽度和使用固定长度的字段)
- 数据库I/O方面
增加缓冲区、如果涉及表的级联,最好将不同表放在不同的磁盘,增加I/O速度
- Sql语句方面
优化sql语句,减少比较次数、限制返回的条目数(limit)、如果可能保证数据的完整性,尽量不使用外键(外键会影响插入和删除性能)
- java方面
如果有重复使用的查询,最好用哪个preparedstatement,因为他是预编译的,只要运行就好
3.范式
- 第一范式:原子性,意思就是说,表不可以拆分,即一列只有一个值。
- 第二范式:满足第一范式的基础上,每一行均能被唯一的区分,存储唯一标识的列即为主键列。
- 第三范式,建立在第二范式基础上,不包含其他表中非主属性以外的关键字信息。非主属性对码不存在部分依赖,也不存在传递依赖。
- BCNF:不存在关键字段决定关键字段的情况。如(仓库号,管理员号)。可以依据两个字段,将表拆成管理表和仓库表两个表。
- 第四范式:表中最多只有一个多值事实。如(员工号,孩子姓名,职工选修课程),一个员工可以有多个孩子,一个员工也可以选多门课程,因此存在两个多值依赖,不符合4NF,可以拆分成两个表,每个表中有一个多值事实。
4.Union与Union all
Union在合并时会去除重复元素,而Union all是简单的合并,并不去除重复元素,因此效率要更高。在没有重复数据的情况下用Union all。
5.数据库引擎
- InnoDB:提供提交、回滚、崩溃恢复能力的事务安全能力,实现并发控制(支持事务、支持行级锁、支持MVCC--多版本并发控制、支持外键、不支持全文索引)
四大特性:插入缓冲、二次写、自适应哈希索引、预读
- MyISAM:插入查询效率很高,主要用于插入和查询(不支持事务、支持表级锁、不支持MVCC、不支持外键、支持全文索引) (内部维护计数器)
- memory:用于存放临时数据,数据量不大且安全性要求不高
- archive:如果只有插入和查询可用,支持高并发的插入操作,但本身不是事务安全的
6.InnoDB事务与日志的实现方式
- 查询日志:记录所有对数据库的请求(不管是否被正确执行)
- 二进制日志:记录所有对数据库的修改操作
- 慢日志:设置一个阈值,运行时间超过该阈值的所有SQL语句都记录到慢日志中
- 错误日志:记录出错信息,一些警告信息或者正确信息。
实现方式:事务日志是通过redo和InnoDB的存储引擎日志缓冲来实现
7.MySQL的三级模式
- 模式(逻辑模式):是数据库中全体数据逻辑结构和特征的描述,是用户的公共逻辑视图
- 外模式(用户模式):是数据库用户的数据视图,是局部数据的逻辑结构和特征的描述
- 内模式(存储模式):一个数据库只有一个内模式。是物理结构和存储方式的描述,是数据在数据库内部的表示方式
8.基本命令
- 表:creat、alter、drop
- 数据库:select、inset、delete、update
- select 属性 from 表名 where...
- insert 属性 into 表名 values()
- delete from 表名 where...
- update 表名 set ...
9.连接
- 内连接:两个表共有的数据(Inner Join 默认是Inner Join,可以省略Inner)
- 左连接:左面表数据为基准,右面没有的补空(从左表返回所有行)
- 右连接:右面数据为基准,左面没有的补空(从右表返回所有行)
- 全连接:返回所有行,不存在的补空
10.Join与Union
- Union是合并两个或多个select语句的结果集,要求select语句的列数相同,且顺序相同,属性必须有相似的数据类型。结果默认的属性名为第一个select中的属性名。Union默认返回不重复的数据,如果需要显示重复的数据,用Union All
- Join用于将两个表或多个表通过键连起来,获取更完整的结果。
11.MySQL中的视图和表
区别:
- 视图是一些预编译的Sql语句,是基于SQL语句结果集的可视化的表
- 视图是虚表,表是实表
- 视图不占用物理存储空间,而表占用物理空间
- 视图的修改只能通过创建语句实现,而表可以通过语句在任何时候修改
- 对视图的简历和删除智慧影响视图本身,不会影响对应的表
- 视图没有实际的物理记录,而表有
- 视图是窗口,而表是内容
- 视图可以防止用户直接接触表,因而用户不知道表结构
联系:
- 视图是建立在表之上的虚表,视图依据表的存在而存在,一个视图可以对应多个表。
- 对视图中数据的删除会影响表中的数据。
12.存储过程和函数
- 存储过程是预编译的Sql语句,用户可以调用存储过程直接执行。函数必须要用括号包住输入的参数,且不能使用临时变量,必须使用表变量。
- 存储过程可以作为独立的一部分来执行,而函数必须作为查询语句的一部分来调用,由于函数可以返回一个表对象,因此他可以出现在from关键字的后面。
- 存储过程不支持return语句,但可以通过output参数返回多个值。函数可以通过return语句返回多个值。
- 存储过程执行速度比较快,因为在创建的时候已经在服务器上进行了编译。
13.触发器
触发器是一种特殊的存储过程,不过他由事件触发,并不是程序调用或者手工启动。由数据库服务器自动激活。
类似于约束,但比约束更加灵活,可以实施比约束更加复杂的检查和操作。
触发器有两种:DML触发器(普通的 INSERT / UPDATE / DELETE 触发器)和DLL触发器(一些特有的 DDL 语句的触发器)。
DML触发器是数据库服务器发生数据库操作语言事件时执行的存储过程,分为after和instead of。after是在记录改变之后进行,instead of是在记录改变之前执行触发器本身定义的操作而不是执行原来sql语句里的操作。
DLL触发器是在响应数据定义语言事件是执行的存储过程。
14.事务隔离级别
- 未提交读(read uncommitted):即使对数据库的修改没有提交,对其他事务也可见(脏读、不可重复读、幻读)
- 读已提交(read committeed):大多数数据库默认的隔离级别,解决了脏读,但是一个事务执行两次同样的查询,可能得到不同的结果。(不可重复读、幻读)
- 可重复读(repeatable read):mysql默认的隔离级别。保证一个事务多次读取同样的记录结果是一致的。(幻读)innodb通过多版本并发控制(MVCC)解决了幻读的问题。
- 串行化(serializable):强制事务串行执行,在每一行上均加锁,因此会导致大量超时与锁争用问题。
15.关系数据库的特点
- 数据结构化:整个数据库按一定的结构形式构成,数据在记录内部和记录类型之间相互关联
- 数据冗余度小:数据是面向整个系统,数据统一定义、组织和存储,集中管理,避免了不必要的冗余
- 数据独立性高:数据库中的数据独立于应用程序
- 数据共享性好:数据库中数据可以供多个用户使用,不同用户可以同时存取数据而不相互影响
- 数据集中控制:集中控制、维护、管理有关数据。(文件管理方法中,文件是分散的,每个用户和每种处理都有各自的文件,不同文件之间是没有联系的,因此不能按照统一的方法来控制、维护和管理)
- 统一的数据保护功能:多用户共享数据的情况下,对用户使用数据有严格的检查,拒绝非法用户进入数据库,保证数据的安全性、一致性和并发控制
16.三个线程(MySQL复制原理及流程)
- 主:binlog线程,记录所有改变了数据库数据的语句,放到master下的binlog中。
- 从:io线程,在使用start slave之后,负责从master上拉取binlog内容,放进自己的relay log中
- 从:sql执行线程,负责执行relay log中的语句
17.delete、truncate、drop
- delete可以删除表中数据,可加where子句;truncate可以删除表中的数据,在插入时,自增id从1开始;drop用于删除表
- delete删除时,不会改变原来表或索引所占用的空间;truncate删除后,会将表或索引所占空间回复到原始大小;drop会将表所占的空间全部释放
- delete每次删除一行,在插入时从原来计数值基础上变化;truncate删除表中所有行,但表的结构、约束、索引等保持不变,计数值回复到初始1;drop是删除表定义和数据
delete与truncate:
- delete可以加where,可以用于删除数据也可用于删除视图;而truncate止咳用于删除数据;
- 删除数据时,delete每次删除一行,并将删除操作作为事务记录在日志日志中便于回滚,因此删除苏读可能会慢一些;而truncate删除数据时,并不把单独的删除操作记录到日志中保存,删除行是不能回复的,删除苏读要快
18.索引
索引的实现通常使用B树或其变种B+树。
B-树:一个节点占一页。每个非叶节点存储两个键值(以及数据)和三个指针,键值升序排列,三个指针对应于两个键值的三个区间,指向子树的根节点,指针存储的是子节点所在磁盘的块地址。
B+树:考虑到数据过大,节点存储的key值数量很少,B+树将所有数据按照键值大小存储在叶节点中,节点之间有一个链指针,非叶节点只存储key(按大小排序存储)和指针。InnoDB用B+树实现其索引结构。B+树分为主键索引和辅助索引,主键索引是叶节点包含所有的数据,而辅助索引叶节点不包含所有数据,而是存储相应行数据的聚集索引键。
建立索引的原则:
- 在经常使用查找的列上建立索引:加快搜索速度
- 在主键列上建立索引:强制数据的唯一性以及组织表中数据的排列结构
- 在经常连接的列(外键)上建立索引:加快连接速度
- 在使用where子句的列上建立索引:加快条件判断的速度
- 在经常需要根据范围搜索的列上建立索引:因为索引已经排好序,其指定的范围是连续的
不能建立索引:
- 对应列数值很少
- 对应列的类型为text、image、bit等
- 在查询中很少使用的列
- 修改的性能远远大于检索性能时
数据库设计器中创建三种索引:
- 唯一索引:不允许任何两行有相同的索引值
- 主键索引:在数据库关系图中建立主键将自动的创建主键索引,主键索引是唯一索引的特殊类型
- 集聚索引:聚集索引表中行的物理顺序与键值的(索引)逻辑顺序相同。