索引
索引类似字典目录,一般对数据表的指定字典建立索引能够提高查询效率
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
订单表
订单号 商品名 单价 购买数量 总价格 用户名 用户密码 用户的地址
数据库设计范式只是在数据设计阶段提供参考依据,满足数据设计范式的表,数据冗余会较少,属于较为合理设计,但是有些时候,设计的表不满足三范式时或许在查询时更为简洁,会考虑从实际情况出发进行设计