- 存储程序
- 触发器
存储程序,存储在服务器端。
由事件(增删改)调用,不能传参。
CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE } trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
delimiter //; create trigger tri_user after delete on userinfo for each row begin # old new insert into user_bak values(old.uid,old.uname,old.password); end;
触发器: 不要添加过多触发器,降低效率 存储程序中不能使用事务控制。 |
- 视图
- 什么是视图
数据库对象,他是一个虚拟表,底层并非以键值形式保存数据,在执行过程中动态从基表中获取数据。(视图以表为底层来查询)
- 视图基本语法
Create view view_name As 查询 create or replace view view_emp as select * from emp where deptno = 10 with check option;
with check option:保护视图数据。只能在视图范围之内进行数据的修改。 修改视图会修改底层基表的数据。 视图一般只执行查询,不执行增删改。
销毁视图 Drop view view_emp; |
- 视图优点
安全性: 保密敏感数据。
高效性: 提高查询效率。
定制化数据: 可以将多张表中经常展示数据放置在视图中快速查询。
- 索引
- 什么是索引
提升查询效率而创建数据结构。
- 索引分类
B-Tree:默认
mysql中默认采用B+树方法来维护索引列数据。
B+树是一个多路搜索树。
不同的存储引擎对索引的存储策略不一致。
MyIsam:叶子节点中保存记录的地址。
Innodb:叶子节点中直接保存相应数据。
位图索引
哈希索引
- 索引的创建
单列索引:
普通索引:
create index index_name on 表(字段);
唯一索引:
create unique index index_name on 表(字段);
全文索引:
空间索引:
复合索引:多列作为索引字段
删除索引:drop index 名字 on 表;
- 索引的选择
索引需要单独文件来保存维护。
表数据发生变化需要维护索引表。
适合添加索引:
表数据量足够大;
增删改操作较少;
高基数列
索引说明:
索引不适合添加过多;
经常作为查询条件的列适合作为索引列;
但是某些特殊情况下索引会失效:
- 数据库的设计
- 数据库设计的含义
查询和项目的基础(基石),数据库的优化前提就是数据库设计
- 数据库设计步骤
需求分析
概念结构模式: E-R模型图
关系模型: 将E-R转换为表,设置外模式
物理设计: 视图,索引
调试:
运行和维护
- 数据库设计的范式
1NF:所有域都是原子性的。域中的数据不可分割。
2NF:非主键字段必须与主键相关(每张表只描述一列事物),而不能与主键部分相关(联合主键)
3NF:非主键字段必须与主键直接相关,非主键字段之间不直接相关
- E-R图(实体关系图)
客观世界抽象的模型展示。
实体: 矩形框
关系: 菱形框
属性: 椭圆形框
- 实体之间的关系
一对一: 个人信息和档案
- 外键添加唯一约束
- 主键做外键
一对多(多对一): 雇员和部门
多对多: 学生和课程
添加第三张关系表
设置外键以及联合主键
- 数据库优化
sql优化:
- 尽量减少*的使用(*转换为列名,然后再查询)
- 索引失效的状况:
- 索引列不要使用is not null/is null
- 索引列不要使用函数
- 索引列不要计算
- 索引列不要使用not(!=/<>)
- 索引列不要使用or(union替换)
- 索引列不要使用包含(like ‘%s%’)
- exists和in的选择
exists先执行主查询
in先执行子查询
先过滤再关联
- 备份和还原
Mysqldump -uroot -proot dbname > d:/t.sql;
mysql -u root -p < C:\backup.sql