视图(View)
视图是简化查询过程,提高数据库安全性的虚拟表,它保存的仅仅是一条select语句,保存的是视图的定义,并没有保存真正的数据。
视图中的源数据都来自于数据库表,数据库表称为基本表或者基表,视图称为虚拟表。
注意:使用视图关注重点就在select语句上,因为select语句不一样,得到的结果集也是不一样的。
好处:
- 安全,可用作权限控制
- 提升查询效率
- 灵活
- 数据独立
语法:CREATEA VIEW 视图名字 AS SELECT 语句;
查看当前用户是否有创建视图的权限:
SELECT Select_priv , Create_view_priv FROM MySQL.user WHERE user = ‘用户名’;
MySQL存储过程
概念:
存储过程(Stored )是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。类似于java中的方法。
作用:
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
本质:
数据库 SQL 语言层面的代码封装与重用。
优势
- 存储过程在创建的时候直接编译,提高了执行效率
- 一个存储过程可以被重复使用.
- 存储过程只会连接一次数据库
- 存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。
劣势
- 可移植性太差了
- 对于简单的sql语句,毫无意义
- 对于只有一类用户的系统安全性毫无意义
- 团队开发,标准定不好,后期维护困难
- 对于开发和调试都不方便
- 复杂的业务逻辑,用存储过程比较困难的
语法:
CREATE PROCEDURE sp_name (参数类型 参数名 数据类型 ,...)
BEGIN
SQL语句集合;
END
说明:
sp_name :存储过程名字
BEGIN … END: 存储过程开始和结束符号
参数类型:参数类型可以是以下三种[ IN | OUT | INOUT ]:
IN 输入参数:表示调用者向过程传入值
OUT 输出参数:表示过程向调用者传出值
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值
MySQL引擎
数据库存储引擎是规定数据表如何存储数据,如何为存储的数据建立索引以及如何支持更新、查询等技术的实现。
由于在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型,也就是说存储引擎是针对表而言的。
在MySQL5.5之前的版本中,默认的存储引擎MyISAM
在MySQL5.5版本及之后的版本中,默认的存储引擎就是InnoDB
MyISAM存储引擎特点:
- 在做插入、查询时速度快,性能高
- 支持全文索引,表级锁
- 不支持事务,外键
InnoDB存储引擎特点:
- 支持外键、支持事务
- 支持行级锁,因此在高并发量的情况下效率高
- 不支持全文索引 MySQL5.6之前不支持 后面的支持
MySQL索引
概念
- 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度
分类
- 普通索引 :仅加速查询
- 唯一索引 :加速查询 + 列值唯一(可以有null)
- 组合索引 :多列值组成一个索引
- 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null)
- 全文索引:MySQL5.6之前只有MyISAM引擎支持全文索引,MySQL5.6之后,MyISAM及InnoDB都支持全文索引
哪些情况需要创建索引
- 主键自动建立唯一索引,任何表一定要建主键
- 频繁作为查询条件的字段应该创建索引
- 查询中与其它表关联的字段,外键关系建立索引
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或者分组字段
哪些情况不需要创建索引
- 表记录太少
- 经常增删改的表或者字段,因为对表进行INSERT、UPDATE和DELETE。
因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。 - Where条件里用不到的字段不创建索引
索引优点
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
- 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
- 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
- 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
使用索引注意事项
- 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
- 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
- 存储引擎不能使用索引中范围条件右边的列
- mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描
- is not null 也无法使用索引,但是is null是可以使用索引的
- like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作
MySql事务
概念
指单个逻辑单元内的所有操作、要么全部成功、要么全部失败。事务是保证数据准确性、一致性、完整性的一种机制!
事务的四大特性(ACID)
- 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。事务是一个不可分割的整体。
- 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏
- 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
- 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。只要是事务提交,对表中数据的影响是持久的!
事务的隔离级别:
- read uncommitted (读未提交) 产生了脏读、不可重复读、幻读的问题
- raed committed (读提交) 产生了不可重复读、幻读的问题
- repeatable read (重复读) 产生了幻读的问题 serializable(MySql默认事务隔离级别)
- 串行化,解决了所有问题,但是效率低!
脏读: 一个事务读取到另外一个事务未提交的数据
不可重复读: 一个事务前后读取数据不一致,是由于另一个事务执行了update更新操作
幻读: 一个事务前后读取数据不一致,是由于另一个事务执行了insert添加、delete删除操作