一. 视图
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,...);