MySQL系列(四)之【视图,索引,数据备份与恢复】详解

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL系列(四)之【视图,索引,数据备份与恢复】详解

一. 视图

1.1 什么是视图?

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。同真实表一样,视图也由列和行构成。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。

数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表中。使用视图查询数据时,数据库会从真实表中取出对应的数据。因此,视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变。

视图可以从原有的表上选取对用户有用的信息,那些对用户没用,或者用户没有权限了解的信息,都可以直接屏蔽掉,作用类似于筛选。这样做既使应用简单化,也保证了系统的安全。

1.2 视图与数据表的区别

1.2.1 存储方式

数据表是实际存储数据的物理结构,而视图是基于一个或多个表的查询结果的虚拟表,不存储实际的数据。

1.2.2 数据更新

可以向数据表插入、更新和删除数据,而视图是通过查询表生成的,无法直接更新。

1.2.3 结构定义

数据表需要定义表结构,包括列名、数据类型和约束等。视图的结构是由查询语句定义的,基于底层表的列。

1.2.4 存储空间

数据表需要占用存储空间来存储实际的数据,而视图不占用存储空间,只是一个动态生成的查询结果。

1.2.5 数据完整性

数据表可以定义主键、唯一约束和外键等完整性约束,用于保证数据的一致性和完整性。视图不能定义这些完整性约束。

1.2.6 访问权限

可以对数据表设置权限,控制用户对数据的访问和操作权限。视图可以通过设置权限来控制用户对查询结果的访问权限。

1.2.7 索引

数据表可以创建索引以提高查询性能,而视图不支持直接创建索引。但是可以在底层表上创建索引,然后在视图中使用该索引。

1.2.8 执行效率

数据表上的操作和查询是直接在存储的数据上执行的,而视图需要在每次查询时执行底层的查询语句,可能会导致一些性能损耗。

综上所述,数据表是实际存储数据的物理结构,可以直接插入、更新和删除数据,并支持完整性约束和索引。而视图是基于查询语句生成的虚拟表,不存储实际的数据,无法直接更新,并且不能定义完整性约束和索引。视图更多地用于简化复杂的查询和控制数据访问权限。

1.3 视图的优点

1.3.1 定制用户数据,聚焦特定的数据

在实际的应用过程中,不同的用户可能对不同的数据有不同的要求。

例如,当数据库同时存在时,如学生基本信息表、课程表和教师信息表等多种表同时存在时,可以根据需求让不同的用户使用各自的数据。学生查看修改自己基本信息的视图,安排课程人员查看修改课程表和教师信息的视图,教师查看学生信息和课程信息表的视图。

1.3.2 简化数据操作

在使用查询时,很多时候要使用聚合函数,同时还要显示其他字段的信息,可能还需要关联到其他表,语句可能会很长,如果这个动作频繁发生的话,可以创建视图来简化操作。

1.3.3 提高数据的安全性

视图是虚拟的,物理上是不存在的。可以只授予用户视图的权限,而不具体指定使用表的权限,来保护基础数据的安全。

1.3.4 共享所需数据

通过使用视图,每个用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,同样的数据只需要存储一次。

1.3.5 更改数据格式

通过使用视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中。

1.3.6 重用 SQL 语句

视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图。

1.4 创建视图的语法

可以使用 CREATE VIEW 语句来创建视图。语法格式如下:

CREATE VIEW <视图名> AS <SELECT语句>


语法说明如下。

  • <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
  • <SELECT语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。

对于创建视图中的 SELECT 语句的指定存在以下限制:

  • 用户除了拥有 CREATE VIEW 权限外,还具有操作中涉及的基础表和其他视图的相关权限。
  • SELECT 语句不能引用系统或用户变量。
  • SELECT 语句不能包含 FROM 子句中的子查询。
  • SELECT 语句不能引用预处理语句参数。

视图定义中引用的表或视图必须存在。但是,创建完视图后,可以删除定义引用的表或视图。可使用 CHECK TABLE 语句检查视图定义是否存在这类问题。

视图定义中允许使用 ORDER BY 语句,但是若从特定视图进行选择,而该视图使用了自己的 ORDER BY 语句,则视图定义中的 ORDER BY 将被忽略。

视图定义中不能引用 TEMPORARY 表(临时表),不能创建 TEMPORARY 视图。

WITH CHECK OPTION 的意思是,修改视图时,检查插入的数据是否符合 WHERE 设置的条件

 

二. 索引

2.1 什么是索引?

MySQL索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。 用于提高数据库中表的查询性能。索引可以帮助数据库更快地定位和检索数据,类似于书籍的目录。

2.2 为什么要使用索引?

索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一 一对应关系的有序表。

索引是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。

在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

2.2.1 顺序访问

顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。

顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。

2.2.2 索引访问

索引访问是通过遍历索引来直接访问表中记录行的方式。

使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。

简而言之,不使用索引,MySQL 就必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL 就能快速到达一个位置去搜索数据文件,而不必查看所有数据,这样将会节省很大一部分时间。

2.3 索引的优缺点

索引有其明显的优势,也有其不可避免的缺点。

索引的优点如下:

1. 提高查询性能

索引可以加快数据库的查询速度,通过快速定位和筛选数据,减少需要扫描的数据量,从而减少查询操作的时间。索引可以让数据库更快地定位数据,加速数据检索。

2. 加速排序和分组操作

索引可以加速排序和分组操作,避免对整个表进行排序或分组,而只需对索引进行操作。这样可以极大地提高处理大量数据的排序和分组的效率。

3. 改善连接操作

在连接多个表进行关联查询时,索引可以提高连接操作的性能。通过在连接字段上创建索引,数据库可以更快地定位和匹配相关数据行,提高连接查询的效率。

4. 保证数据唯一性和完整性

通过在主键字段或唯一索引字段上创建索引,可以确保数据的唯一性。索引可以防止重复数据的插入,并保证数据的完整性。

增加索引也有许多不利的方面,主要如下:

1. 占用存储空间

索引需要额外的存储空间来存储索引数据结构,特别是对于大型表和复合索引,索引所占用的存储空间可能很大。

2. 增加写操作的成本

当进行数据插入、更新或删除时,索引不仅需要更新实际数据,还需要更新索引数据结构。这会增加写操作的成本和时间。、

3. 可能引发查询优化器错误

在某些情况下,索引可能会导致查询优化器错误地选择使用索引,而不是更有效的查询计划。这可能会导致查询性能下降。

4. 索引维护开销

随着数据的增长和变化,索引需要定期进行维护,以保持索引的有效性。索引维护的开销可能在大型数据集上变得显著。

索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。

2.4 何时不使用索引?

  • 表记录太少
  • 经常增删改的表
  • 数据重复且分布均匀的表字段,只应该为经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)
  • 频繁更新的字段不适合创建索引(会增加IO负担)
  • where条件里用不到的字段不创建索引

2.5 索引何时失效?

  • like以通配符%开头索引失效
  • 当全表扫描比走索引查询的快的时候,会使用全表扫描,而不走索引
  • 字符串不加单引号索引会失效
  • where中索引列使用了函数(例如substring字符串截取函数)
  • where中索引列有运算(用了< or > 右边的索引会失效,用<= or >= 索引不会失效)
  • is null可以走索引,is not null无法使用索引(取决于某一列的具体情况)
  • 复合索引没有用到左列字段(最左前缀法则,如果没用用到最左列索引,或中间跳过了某列有索引的列,索引会部分失效)
  • 条件中有or,前面的列有索引,后面的列没有,索引会失效。想让索引生效,只能将or条件中的每个列都加上索引

2.6 索引分类

1. 主键索引(Primary Key Index)

用于唯一标识表中的每一行数据,保证数据的唯一性。主键索引自动建立在主键字段上,可以加快数据的访问速度。

简单来说:主键索引是加速查询 + 列值唯一(不可以有null)+ 表中只有一个。

2. 唯一索引(Unique Index)

确保索引字段的值在表中是唯一的,但允许空值。

3. 普通索引(Normal Index)

普通索引是最基本的索引,它没有任何限制。

  • 创建索引语法:
create index index_name on table(column);
  • 修改表结构方式添加索引:
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
  • 删除索引
DROP INDEX index_name ON table

4.  全文索引(Full-Text Index)

  • 概念

全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。

fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。

值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。

  • 版本支持

Mysql 5.6之前版本,只有MyISAM支持全文索引,5.6之后,Innodb和MyISAM均支持全文索引。另外,只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

5. 组合索引(Composite Index)

组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。

三. 数据的备份与恢复

3.1 使用Navicat工具导入

3.2 使用mysqldump导入

mysqldump 是 MySQL 用于备份数据库的实用程序。它主要产生一个 SQL 脚本文件,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。

3.2.1 导出表数据和表结构

mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql(这个名字随便叫)

3.2.2  只导出表结构

mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql

3.2.3 导入方法一

注意:首先建立空数据库

mysql>create database abc;
   mysql>use abc;                   #选择数据库
   mysql>set names utf8;            #设置数据库编码
   mysql>source /D:/SoftwareInstallPath/mysql-8.0.13-winx64/bin/1234567.sql;  #导入数据

3.3.4 导入方法二

 

mysql -u用户名 -p密码 数据库名 < 数据库名.sql

3.3 使用单表数据导入load data infile 的方式

可先通过SELECT INTO OUTFILE方式,将数据导出到Mysql的C:\ProgramData\MySQL\MySQL Server 5.5\data目录下,再通过LOAD DATA INFILE方式导入。

1. select * from 表名 into outfile '/文件名.sql';
2. load data infile '/文件名.sql' into table 表名(列名1,...);

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
29天前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
63 3
Mysql(4)—数据库索引
|
20天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
96 1
|
30天前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
63 1
|
21天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
49 0
|
21天前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(8)作者——LJS[含MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;注意点及常见报错问题所对应的解决方法]
MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;举例说明注意点及常见报错问题所对应的解决方法
|
1月前
|
监控 关系型数据库 MySQL
mysql8索引优化
综上所述,深入理解和有效实施这些索引优化策略,是解锁MySQL 8.0数据库高性能查询的关键。
36 0
|
1月前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。
|
1月前
|
关系型数据库 MySQL 数据库
深入浅出MySQL索引优化:提升数据库性能的关键
在这个数据驱动的时代,数据库性能的优劣直接关系到应用的响应速度和用户体验。MySQL作为广泛使用的数据库之一,其索引优化是提升查询性能的关键。本文将带你一探MySQL索引的内部机制,分析索引的类型及其适用场景,并通过实际案例演示如何诊断和优化索引,以实现数据库性能的飞跃。
下一篇
无影云桌面