MySQL_10 存储引擎和视图

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL 第十节 存储引擎和视图 内容分享。

目录

一、存储引擎

       1.介绍 :

       2.分类 :

       3.选择 :

二、视图

       1.概述 :

       2.原理 :

       3.使用格式 :

       4.代码演示 :

       5.应用实例 :


一、存储引擎

       1.介绍 :

       MySQL的表类型由表的存储引擎(Storage Engines)决定主要包括InnoDB, MyISAM, Memory等等。

       2.分类 :

        MySQL数据表主要支持六种类型——

       ①CSV;

       ②Memory : 数据存放在内存中,速度很快,适合临时表;

       ③ARCHIVE : 存档类型的存储引擎,批量插入操作的速度非常高;

       ④MRG_MYISAM : 集合性质的存储引擎;

       ⑤MyISAM : 进行批量插入的操作时速度很快;

       ⑥InnoDB : MySQL默认的存储引擎,支持事务机制;

       可以通过SHOW ENGINES指令来查看所有的存储引擎,如下图所示 :

image.gif 编辑

        以上六种类型根据是否支持事务又可分为两大类——

       ①“事务安全型” (TRANSACTION-SAFE): 支持事务。eg : InnoDB(其余都属于非事务安全型)

       ②“非事务安全型”(NON-TRANSACTION-SAFE) : 不支持事务。eg : Memory, MyISAM;

               PS : 主要的存储引擎及特点,如下图所示 :

image.gif编辑

               InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB引擎写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。

               MyISAM存储引擎既不支持事务,也不支持外键,但其访问速度快,对事务完整性没有要求。

               Memory存储引擎使用存在于内存中的内容来创建表。每个Memory表只实际对应一个磁盘文件。Memory类型表的访问速度非常快(没有I/O读写),因为它的数据是存放在内存中的,并且默认使用了HASH索引。但是,一旦MySQL服务被关闭(eg : 重启MySQL80服务),表中的数据就会全部丢失掉(表的结构还在)。

       3.选择 :

        若应用不需要事务,只是处理基本的CRUD操作,那么选择MyISAM类型表会很大地提高表的访问速度。

        若应用需要事务的支持,选择InnoDB引擎就完事儿了。

       若表中的数据更新十分频繁,可以考虑使用Memory存储引擎。Memory存储引擎会将数据存储在内存中,由于没有磁盘I/O的等待,速度极快。但每次MySQL服务重启后,所做的任何数据修改都会消失。EG : 用户在线状态的显示

              PS :
               
可以通过 ALTER TABLE table_name ENGINE = engine_name; 修改表的存储引擎。                


二、视图

       1.概述 :

       视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图也包含列(字段),但其数据是来源于对应的真实表(也叫基表,基表可以有多张),称视图与基表之间存在映射关系通过视图可以修改基表中的数据,而基表的修改也会影响到视图的数据(可以类比Java中多个引用指向堆空间中同一对象)。

       当表中的某些字段不想被直接访问时,就可以利用视图,规定用户可以访问的字段,用户通过视图与基表之间的映射关系来访问基表中对应的数据。

       2.原理 :

               有隐私需求的一方可以限定表中的部分列为可访问,并为这些可访问的列创建视图;其他用户会通过视图与基表的映射关系,来访问基表中相应字段的数据

               我们先来建一张员工表,代码如下 :

CREATE TABLE IF NOT EXISTS `employee`(
    `eno` MEDIUMINT UNSIGNED UNIQUE NOT NULL DEFAULT 0,
    `ename` VARCHAR(20) NOT NULL DEFAULT '',
    `ecareer` VARCHAR(20) NOT NULL DEFAULT '',
    `mgr` MEDIUMINT UNSIGNED,
    `hiredate` DATE NOT NULL,
    `esalary` DECIMAL(8,2) NOT NULL DEFAULT 0.0,
    `ebonus` DECIMAL(8,2) DEFAULT 0.0,
    `deptno` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;
INSERT INTO `employee`
    VALUES
    (5000, 'Cyan', 'Full_Stack', 2000, '2002-1-1', 9000, NULL, '20'),
    (5001, 'Five', 'Back_End', 2000, '2002-1-1', 9000, 10000, '20'),
    (5534, 'Raina', 'Sale', 2766, '2003-3-1', 5000, 5000, '30'),
    (5537, 'Ice', 'Back_End', 2000, '2003-6-12', 9000, 10000, '20'),
    (5600, 'Kyrie', 'Fore_End', 2000, '2004-9-1', 9500, 20000, '20'),
    (5611, 'James', 'Sale', 2766, '2004-9-13', 5500, 10000, '30'),
    (5612, 'Bob', 'Sale', 2766, '2004-9-15', 5500, 10000, '30'),
    (5700, 'Alice', 'Manage', 1088, '2004-10-1', 20000, 30000, '10'),
    (6111, 'Fiven', 'Manage', 1088, '2006-1-11', 20000, 30000, '10'),
    (6113, 'Cyana', 'Fore_End', 2000, '2006-1-11', 11000, 20000, '20'),
    (6150, 'Peter', 'Accounting', 1760, '2006-3-1', 6000, 20000, '40'),
    (6300, 'White', 'Accounting', 1760, '2009-6-6', 7000, 20000, '40'),
    (6381, 'Frank', 'Manage', 1900, '2010-1-3', 25000, 50000, '10');
SELECT * FROM `employee`;

image.gif

               员工表如下 :  

image.gif编辑

               若我们不想让“上级信息”,“入职信息”,“工资”和“奖金”这些比较敏感的字段被任意访问的话,就可以建立对应的视图,在视图中排除这些不想被任意访问的列,如下图所示 :

image.gif编辑

               当用户想要通过视图查询数据时,就会通过映射关系找到基表中相应的字段,并将字段的数据返回给用户。

               当用户想要通过视图修改数据时,假设WHERE子句只有一个条件,那么需要进行两次映射才能完成该操作,第一次映射是去真实表中找到查询条件的字段,第二次映射是去真实表中找到要修改的字段。

       3.使用格式 :

        CREATE VIEW view_name AS SELECT...;

        ALTER VIEW view_name AS SELECT...;

       SHOW CREATE VIEW view_name;    //显示创建视图的指令

        DROP VIEW view_name1, view_name2...;

       PS :

       ①创建视图后,数据库中仅存在一个对应的视图结构文件(.frm文件),而不存在数据文件。PS : MySQL8.0中不再单独提供.frm文件,而是合并在.ibd文件中

       视图数据的变化会影响到对应的真实表,真实表数据的变化也会影响到视图。

      ③视图中可以再使用视图;但本质上数据都是来自于基表[映射关系]。

       4.代码演示 :

       操作员工表employee,要求员工的上级信息,入职时间,工资和奖金不能直接访问,要求通过建立视图来实现,如下 :

CREATE VIEW emp_view_1 
    AS 
    SELECT eno, ename, ecareer, deptno
    FROM employee;
SELECT * FROM emp_view_1;

image.gif

image.gif编辑

image.gif编辑

               通过视图修改基本表的数据,如下 :

UPDATE emp_view_1
        SET ecareer = 'Big_Data'
    WHERE eno = 5000;
SELECT * FROM emp_view_1;
SELECT * FROM employee;

image.gif

image.gif编辑

image.gif编辑

               基本表的数据随着视图的更改而发生了变化

               继续,直接通过基本表来修改数据,如下 :

UPDATE employee
    SET ecareer = 'Full_Stack'
    WHERE ename = 'Five';
SELECT * FROM emp_view_1;
SELECT * FROM employee;

image.gif

image.gif编辑

image.gif编辑

               视图查询的数据随着基本表的更改也发生了变化。

               继续,尝试在视图上再次创建新的视图,如下 :  

CREATE VIEW emp_view_2
    AS
    SELECT eno, ename 
    FROM emp_view_1;
SELECT * FROM emp_view_2;

image.gif

image.gif编辑

       5.应用实例 :

       1° 安全 : 对于包含重要信息的数据表,有些字段是保密的,不能让用户直接看到。这时就可以创建一张视图,在视图中仅保留可见字段。这样既可以满足用户的查询需求,也能做到让用户无法直接查看保密的字段

       2° 性能 : 关系数据库中的数据常常会分表存储,往往通过外键约束来建立表与表之间的关系。这时,在查询时通常会用到连接(JOIN),不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN来查询数据

       3° 灵活 : 如果系统中有一张旧表,该表由于设计问题即将被废弃,但是很多应用的数据都是基于这张表的,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表,这样既可以少做很多改动,也达到了升级数据表的目的。

       System.out.println("END------------------------------------------------------------------------------");

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
22天前
|
存储 SQL 关系型数据库
MySQL存储引擎
本文介绍了数据库优化的多个方面,包括选择合适的存储引擎、字段定义原则、避免使用外键和触发器、大文件存储策略、表拆分及字段冗余处理等。强调了从业务层面进行优化的重要性,如通过活动设计减少外部接口调用,以及在高并发场景下的流量控制与预处理措施。文章还提供了具体的SQL优化技巧和表结构优化建议,旨在提高数据库性能和可维护性。
MySQL存储引擎
|
7天前
|
存储 缓存 关系型数据库
【赵渝强老师】MySQL的MyISAM存储引擎
在MySQL5.1版本之前,默认存储引擎为MyISAM。MyISAM管理非事务表,提供高速存储和检索,支持全文搜索。其特点包括不支持事务、表级锁定、读写互阻、仅缓存索引等。适用于读多、写少且对一致性要求不高的场景。示例代码展示了MyISAM存储引擎的基本操作。
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
7天前
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL的Memory存储引擎
MySQL 的存储引擎层负责数据的存储和提取,支持多种存储引擎,如 InnoDB、MyISAM 和 Memory。InnoDB 是最常用的存储引擎,从 MySQL 5.5.5 版本起成为默认引擎。Memory 存储引擎的数据仅存在于内存中,重启后数据会丢失。示例中创建了使用 Memory 引擎的 test3 表,并展示了数据在重启后消失的过程。
|
1月前
|
存储 SQL 缓存
MySQL存储引擎如何完成一条更新语句的执行!
MySQL存储引擎如何完成一条更新语句的执行!
MySQL存储引擎如何完成一条更新语句的执行!
|
16天前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(8)作者——LJS[含MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;注意点及常见报错问题所对应的解决方法]
MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;举例说明注意点及常见报错问题所对应的解决方法
|
2月前
|
存储 缓存 关系型数据库
MySQL高级篇——存储引擎和索引
MyISAM:不支持外键和事务,表锁不适合高并发,只缓存索引,内存要求低,查询快MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。5.5之前默认的存储引擎优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高表名.frm 存储表结构;表名.MYD 存储数据 (MYData);
MySQL高级篇——存储引擎和索引
|
2月前
|
SQL 存储 关系型数据库
mysql-视图的定义和简单使用
这篇文章介绍了MySQL中视图的定义和简单使用方法,包括视图的创建规则和使用限制。通过一个实际的例子,展示了如何创建视图以及如何使用视图来简化复杂的SQL查询操作。
mysql-视图的定义和简单使用
|
2月前
|
存储 缓存 关系型数据库
MySQL 视图:数据库中的灵活利器
视图是数据库中的虚拟表,由一个或多个表的数据经筛选、聚合等操作生成。它不实际存储数据,而是动态从基础表中获取。视图可简化数据访问、增强安全性、提供数据独立性、实现可重用性并提高性能,是管理数据库数据的有效工具。
|
3月前
|
存储 关系型数据库 MySQL
MySQL 中的事务存储引擎深入解析
【8月更文挑战第31天】
53 0