索引

索引类似字典目录,一般对数据表的指定字典建立索引能够提高查询效率

create index 索引名 on 表名(列名)

复合索引

针对多列同时建立索引,在进行查询操作时,同时给定被索引的列

create index 索引名 on 表名(列名1,列名2,……)

唯一索引

要求别索引的列是唯一的数据

create unique 索引名 on 表名(列名)

 

索引能提高数据检索的效率,节省查询时间,但是索引不能随意建立

因为建立索引是,系统需要查询表中的每一条记录,根据这些记录建立索引目录,索引的建立会消耗大量的内存空间,存储指定表的索引,所有应该避免对表数据频繁修改,因为对表中数据修改操作时,同时索引也会随之更新,更新过程也会有时间消耗(以空间换去时间)

注意事项;

1、如果列中数据大量重复时,避免建立索引(比如sex)

2、列经常被修改时,避免建立索引

3、索引的建立通常在大表上(达到一定的数量积,十万,百万…)

4、对于数据量少的表,尽量避免做索引

 

删除索引

drop index索引名 on 表名

 

视图

对于一张或者多张数据表的缩影,视图是一种虚拟的概念,在使用前只是储存在数据库服务器的一条指令,在针对视图使用时,才对物理数据生成一个视图,对于视图的操作,会影响物理数据表

 

视图创建语法

create view 视图名称 as 子查询

视图的使用可以极大简化是复杂的查询,并达到隐藏关键数据目的

避免使用修改视图的数据,对视图数据的更新会影响主表

 

视图删除

drop view 视图名

 

数据库的可编程型

在数据库中通过数据库的基本数据类型,相关关键字,条件分支,循环,结合一条或多条sql指令共同完成以下特定的逻辑,使用sql语句完成类似Java,c++,c编程语言的编程逻辑

MySql中可编程性体现在

存储过程

自定义函数

触发器

 

存储过程

存储过程是存储在数据库服务器中,已经经过数据库预编译操作,在通过应用程序对数据库法强相关的操作时,只需要发射调用指令即可(耗时操作分担数据服务器中解决);在数据库中执行普通的sql 语句的效率远远低于存储过程

缺点:不兼容(不同数据库管理系统的可编程性语法不尽相同)

创建基本语法

create procedure 过程名称(参数列表)

begin

end

存储过程调用

call过程名称()

 

存储过程分类

类似Java中的方法,在一个过程中包含一些用于处理某些复杂逻辑的代码片段

无输入输出参数

有输入无输出参数

无输入有输出参数

有输入有输出参数

 

触发器

数据库完整性约束

1、约束(列级约束)

       主键

       外键

       不为空

       唯一

default

check(不支持)

 

数据库三大范式

1NF

要求数据表中的列是不可再分列的,列为原子列,要求表中的每一列都只能包含一种数据类型,就目前关系型数据来说,不可能设计出不符合第一大范式的表

不符合第一范式的表

用户表1

用户编号 用户姓名 用户信息

修改1

用户表1

用户编号 用户姓名 用户密码 手机号 家庭住址

修改2

用户表1

用户编号 用户姓名 用户密码 手机号 省 市 区 详细地址

2NF

在满足第一大范式的前提下,要求表中的每一列都必须与主键相关,不能间接相关(要有主键,表中所有列直接关联主键)


不符合第二大范式的设计:

商品表

商品id 商品名称 商品单价 库存量 分类名 分类备注 分类备注

 

修改后

商品表

 

类别表

 

设计数据库的原则

1、多对一的关系中,维护关系交给多的一方

2、多对多的关系,维护关系有第三方表维护

3、一对一的关系,维护关系可以使用唯一主键关联,也可以使用唯一外键关联

 

 

3NF

第三范式要求建立在第二范式的基础上,要求表中不存在非关键字段对主键字段的部分依赖

如主键aà列 bà列c

 

订单表

订单号 商品名 单价 购买数量 总价格 用户名 用户密码 用户的地址

 

数据库设计范式只是在数据设计阶段提供参考依据,满足数据设计范式的表,数据冗余会较少,属于较为合理设计,但是有些时候,设计的表不满足三范式时或许在查询时更为简洁,会考虑从实际情况出发进行设计