1. mysql表类型和存储引擎 803
1.1 基本介绍
1. MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。
2. MySQL数据表主要支持六种类型,分别是: CSV、 Memory、ARCHIVE、MRG_MYISAM、MYISAM、 InnoBDB.
3.这六种又分为两类,一类是”事务安全型”(transaction-safe), 比如:InnoDB;其余都属于第类,称为”非事务安全型" (non-transaction-safe)[mysiam和memory].
显示当前数据库支持的存储引擎: show engines;
1.2 主要的存储引擎/表类型特点 803
1.3 细节说明 803
我这里重点给大家介绍三种: MyISAM、InnoDB、MEMORY
1. MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求
2. InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
3. MEMORY存储引擎使用存在内存中的内容来创建表。 每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦MySQL服务关闭,表中的数据就会丢失掉,表的结构还在。
2. 三种存储引擎表使用案例 804
对前面我们提到的三种存储引擎,我们举例说明:
代码在E:\java学习\初级\course164\db_
engines
# mysql表类型和存储引擎 803
-- 查看所有的存储引擎
SHOW ENGINES
-- 三种存储引擎表使用案例 804
-- innodb,存储引擎,是前面使用过.
-- 1. 支持事务 2. 支持外键 3. 支持行级锁
-- myisam 存储引擎
CREATE TABLE t28(
id INT,
`name` VARCHAR(32)) ENGINE MYISAM
-- 1. 添加速度快 2. 不支持外键和事务 3. 支持表级锁
START TRANSACTION;-- 开启事务
SAVEPOINT t1
INSERT INTO t28 VALUES(1,'jack');
SELECT * FROM t28
ROLLBACK TO t1-- 虽然显示回滚成功,但是爆出警告,而且数据并没有回滚成功
SELECT * FROM t28
-- memory 存储引擎
-- 1. 数据存储在内存中[关闭了 Mysql 服务,数据丢失, 但是表结构还在]
-- 2. 执行速度很快(没有 IO 读写) 3. 默认支持索引(hash 表)
CREATE TABLE t29(
id INT,
`name` VARCHAR(32)) ENGINE MEMORY
INSERT INTO t29
VALUES(1,'tom'),(2,'jack'),(3,'lzl')
DESC t29-- 关闭了 Mysql 服务,数据丢失, 但是表结构还在
SELECT * FROM t29-- 数据没了
3. 如何选择表的存储引擎 804
1.如果你的应用不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择,速度快
2.如果需要支持事务,选择InnoDB。
3. Memory存储引擎就是将数据存储在内存中,由于没有磁盘I./0的等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。(经典用法用户的在线状态().)
3.1 修改存储引擎 804
代码在E:\java学习\初级\course164\db_
engines
-- 修改存储引擎 804
ALTER TABLE `t29` ENGINE = INNODB
4. 视图(view) 805
4.1 看一个需求
emp表的列信息很多,有些信息是个人重要信息(比如sal, comm,mgr, hiredate) ,如果我们希望某个用户只能查询emp表的(empno、ename、 job和deptno)信息,有什么办法? =>视图
4.2 基本概念 805
1.视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)
2.视图和基表关系的示意图
4.3 视图的基本使用 806
1. create view 视图名 as select语句(创建视图)
2. alter view 视图名 as select语句----(修改视图相当于,更新成新的视图)
3. SHOW CREATE VIEW 视图名(查看创建视图的指令)
4. drop view 视图名1,视图名2(删除视图)
4.4 完成前面提出的需求
创建一个视图emp view01, 只能查询emp表的(empno、ename、 job和deptno )信息
4.3和4.4代码在E:\java学习\初级\course164\db_
view
#视图的使用 806
-- 创建一个视图emp view01, 只能查询emp表的(empno、ename、 job和deptno )信息
-- 创建视图
CREATE VIEW emp_view01
AS
SELECT empno,ename,job,deptno FROM emp;
-- 查看视图
DESC emp_view01
SELECT *FROM emp_view01
-- 查看视图的部分信息
SELECT empno,job FROM emp_view01
-- 3. SHOW CREATE VIEW 视图名(查看创建视图的指令)
SHOW CREATE VIEW emp_view01
-- 删除视图
DROP VIEW emp_view01
4.5 视图细节讨论 806
1.创建视图后,到数据库去看,对应视图只有一个视图结构文件,并没有数据文件(因为视图数据来自基表)(形式:视图名.frm)
2.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]
------针对前面的雇员管理系统----
mysql> create view myview as select empno ,ename,job,
comm from emp;
mysql> select * from myview;
mysql> update myview set comm= 200 where empno= 7369; //修改视图,对基表都有变化
mysql> update emp set comm= 100 where empno=7369; //修改基表,对视频也有变化
3.视图中可以再使用视图,数据仍然来自基表.. [案例演示]
代码在E:\java学习\初级\course164\db_
view
-- 视图细节讨论 806
-- 1.创建视图后,到数据库去看,对应视图只有一个视图结构文件,
-- 并没有数据文件(因为视图数据来自基表)(形式:视图名.frm)
-- 2.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]
-- 通过修改视图,验证2观点
UPDATE emp_view01
SET job = 'MANAGER'
WHERE empno=7369
SELECT * FROM emp-- 查询基表
SELECT * FROM emp_view01-- 查询视图
-- 修改基表,会影响视图
UPDATE emp
SET job = 'SALESMA'
WHERE empno = 7369
SELECT * FROM emp-- 查询基表
SELECT * FROM emp_view01-- 查询视图
-- 3.视图中可以再使用视图,数据仍然来自基表.. [案例演示]
-- 比如从 emp_view01 视图中,选出 empno,和 ename 做出新视图
DESC emp_view01
CREATE VIEW emp_view02
AS
SELECT empno,ename FROM emp_view01
DESC emp_view02
SELECT * FROM emp_view02
4.6 视图最佳实践 807
1. 安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。
2. 性能。关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。这时,数据库查询通常会用到连接JOIN)。这样做不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。
3. 灵活。如果系统中有-张旧的表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。
4.7 视图课堂练习 807
针对emp , dept, 和salgrade 张表.创建一个视图emp_view03,可以显示雇员编号,雇员名,雇员部门名称和薪水级别[即使用三张表,构建一个视图]
代码在E:\java学习\初级\course164\db_
view02
-- 视图课堂练习 807
-- 针对emp , dept, 和salgrade 张表.创建一个视图emp_view03,可以显示雇员编号
-- ,雇员名,雇员部门名称和薪水级别[即使用三张表,构建一个视图]
/*
分析: 使用三表联合查询,得到结果
将得到的结果,构建成视图
*/
-- 先查询得到 雇员编号,雇员名,雇员部门名称 和 薪水级别
SELECT empno,ename,dname,grade
FROM emp,dept,salgrade
WHERE emp.deptno = dept.deptno AND
(sal BETWEEN losal AND hisal)#员工编号和部门中的编号保持一致,员工薪水要在工资级别最低和最高之间
-- 将得到的结果,构建成视图
CREATE VIEW emp_view03
AS
SELECT empno,ename,dname,grade
FROM emp,dept,salgrade
WHERE emp.deptno = dept.deptno AND
(sal BETWEEN losal AND hisal)
DESC emp_view03
SELECT * FROM emp_view03