MySQL操作(5)索引、视图、导入、导出、备份、恢复
我是一名来自帝都985高校的机械研究生
本号专注于分享工科专业学习考试攻略、程序员学习求职经验、教师求职考试经验等相关内容,同时还会兼顾生活向,欢迎大家的关注和转发!
目录
数据库的其他操作
准备
在正式开始本实验内容之前,需要先下载相关代码。
下载的代码会搭建好一个名为 mysql_shiyan 的数据库(有三张表:department,employee,project),并向其中插入数据。
具体操作如下,首先输入命令进入 /home/shiyanlou/Desktop 目录:
cd /home/shiyanlou/Desktop
然后再输入命令,下载代码:
wget https://labfile.oss.aliyuncs.com/courses/9/MySQL-06.sql
wget https://labfile.oss.aliyuncs.com/courses/9/in.txt
下载完成后,输入命令开启 MySQL 服务并使用 root 用户登录:
# 打开 MySQL 服务
sudo service mysql start
# 使用 root 用户登录
mysql -u root
我们下载了两个文件 MySQL-06.sql 和 in.txt,其中第一个文件用于创建数据库并向其中插入数据,第二个文件用于测试数据导入功能。
输入命令运行第一个文件,搭建数据库并插入数据:
source /home/shiyanlou/Desktop/MySQL-06.sql
索引
索引是一种与表有关的结构,它的作用相当于书的目录,可以根据目录中的页码快速找到所需的内容。
当表中有大量记录时,若要对表进行查询,没有索引的情况是全表搜索:将所有记录一一取出,和查询条件进行对比,然后返回满足条件的记录。这样做会执行大量磁盘 I/O 操作,并花费大量数据库系统时间。
而如果在表中已建立索引,在索引中找到符合查询条件的索引值,通过索引值就可以快速找到表中的数据,可以大大加快查询速度。
对一张表中的某个列建立索引,有以下两种语句格式:
ALTER TABLE 表名字 ADD INDEX 索引名 (列名);
CREATE INDEX 索引名 ON 表名字 (列名);
我们用这两种语句分别建立索引:
ALTER TABLE employee ADD INDEX idx_id (id); #在employee表的id列上建立名为idx_id的索引
CREATE INDEX idx_name ON employee (name); #在employee表的name列上建立名为idx_name的索引
索引的效果是加快查询速度,当表中数据不够多的时候是感受不出它的效果的。这里我们使用命令 SHOW INDEX FROM 表名字;
查看刚才新建的索引:
在使用 SELECT
语句查询的时候,语句中 WHERE
里面的条件,会自动判断有没有可用的索引。
比如有一个用户表,它拥有用户名(username)和个人签名(note)两个字段。其中用户名具有唯一性,并且格式具有较强的限制,我们给用户名加上一个唯一索引;个性签名格式多变,而且允许不同用户使用重复的签名,不加任何索引。
这时候,如果你要查找某一用户,使用语句 select * from user where username=?
和 select * from user where note=?
性能是有很大差距的,对建立了索引的用户名进行条件查询会比没有索引的个性签名条件查询快几倍,在数据量大的时候,这个差距只会更大。
一些字段不适合创建索引,比如性别,这个字段存在大量的重复记录无法享受索引带来的速度加成,甚至会拖累数据库,导致数据冗余和额外的 CPU 开销。
大珠山风景区位于黄岛区西南部海滨,来到这里沿着登山步道而上,可以欣赏各种奇峰异石,参观石门寺、古代佛教造像石窟等古迹,走累了还能品尝甘甜的玉泉水。若是春季来此,漫山遍野的杜鹃花海一定让你大饱眼福。
大珠山主峰大砦顶海拔486米,整座山不算高,爬起来也不会很累。景区主要分为石门寺和珠山秀谷两大游览区,通常的走法是从珠山秀谷这边的入口进入景区,途中观览珠山秀谷、大砦顶、朱朝洞、大珠山石窟、天然大佛、墓塔林、石门寺等景观,从石门寺入口出景区。
每年春季是大珠山的旅游时节。清明前夕在山谷入口可见樱桃花、杏花、桃花相继盛开;而4月中旬至5月中旬的珠山秀谷更是万亩野生杜鹃花竞相开放,红遍山脊,登上山顶远远望去,十分壮美。不过届时专程来赏花的游客人潮汹涌,要有心理准备。
大珠山上有很多奇峰异石,充满灵气。这些巨石有的形似神龟奔月,有的像仙人晒靴,甚至像活灵活现的钟馗,惟妙惟肖。山上还有不少怪石自然堆垒起来的石洞,比如朱朝洞、朝阳洞等。而登上山顶眺望远方,群峰翠色尽收眼底,天气晴朗时,可眺望到胶南城区甚至远处的海岸。
石门寺游览区内古迹甚多,始建于北齐时期的石门寺是有名的礼佛名地,至今已有1500余年历史,此寺因以两块赫然而立的巨石为门而得名,如今寺内建筑古韵犹在。这里还有隋唐时期的佛教造像石窟、石门寺历代高僧的塔林等景点,还能看到端居山巅的奇峰——天然大佛,其佛相十分庄严。
视图
视图是从一个或多个表中导出来的表,是一种虚拟存在的表。它就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。
注意理解视图是虚拟的表:
-
数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中; -
使用视图查询数据时,数据库系统会从原来的表中取出对应的数据; -
视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变; -
在使用视图的时候,可以把它当作一张表。
创建视图的语句格式为:
CREATE VIEW 视图名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;
可见创建视图的语句,后半句是一个 SELECT
查询语句,所以视图也可以建立在多张表上,只需在 SELECT
语句中使用子查询或连接查询。
现在我们创建一个简单的视图,名为 v_emp,包含v_name,v_age,v_phone三个列:
CREATE VIEW v_emp (v_name,v_age,v_phone) AS SELECT name,age,phone FROM employee;
导入
导入一个纯数据文件,该文件中将包含与数据表字段相对应的多条数据,这样可以快速导入大量数据。除此之外,还有用 SQL 语句的导入方式,语法为:source *.sql
。
两者之间的不同是:数据文件导入方式只包含数据,导入规则由数据库系统完成;SQL 文件导入相当于执行该文件中包含的 SQL 语句,可以实现多种操作,包括删除,更新,新增,甚至对数据库的重建。
数据文件导入,可以把一个文件里的数据保存进一张表。导入语句格式为:
LOAD DATA INFILE '文件路径和文件名' INTO TABLE 表名字;
现在桌面上有一个名为 in.txt 的文件,我们尝试把这个文件中的数据导入数据库 mysql_shiyan 的 employee 表中。
由于导入导出大量数据都属于敏感操作,根据 mysql 的安全策略,导入导出的文件都必须在指定的路径下进行,在 mysql 终端中查看路径变量:
mysql -uroot
mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name | Value |
+--------------------------+-----------------------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
3 rows in set (0.00 sec)
注意到 secure_file_priv 变量指定安全路径为 /var/lib/mysql-files/
,要导入数据文件,需要将该文件移动到安全路径下。
打开 Xfce 终端,输入命令拷贝 in.txt 文件夹到 /var/lib/mysql-files/ 目录:
sudo cp -a /home/shiyanlou/Desktop/in.txt /var/lib/mysql-files/
使用命令 sudo cat /var/lib/mysql-files/in.txt
查看 in.txt 文件中的内容:
可以看到其中仅仅包含了数据本身,没有任何的 SQL 语句
再使用以下命令以 root 用户登录数据库,再连接 mysql_shiyan 数据库:
# 在Xfce 终端输入命令
mysql -u root
# 在 MySQL 控制台中输入命令
use mysql_shiyan
查看一下没有导入数据之前,employee 表中的数据:
现在执行导入语句,文件中的数据成功导入 employee 表:
LOAD DATA INFILE '/var/lib/mysql-files/in.txt' INTO TABLE employee;
导出
导出与导入是相反的过程,是把数据库某个表中的数据保存到一个文件之中。导出语句基本格式为:
SELECT 列1,列2 INTO OUTFILE '文件路径和文件名' FROM 表名字;
注意:语句中 “文件路径” 之下不能已经有同名文件。
现在我们把整个 employee 表的数据导出到 /var/lib/mysql-files/ 目录下,导出文件命名为 out.txt 具体语句为:
SELECT * INTO OUTFILE '/var/lib/mysql-files/out.txt' FROM employee;
使用 sudo cat /var/lib/mysql-files/out.txt
命令查看。
备份
数据库中的数据十分重要,出于安全性考虑,在数据库的使用中,应该注意使用备份功能。
备份与导出的区别:导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。
mysqldump
是 MySQL 用于备份数据库的实用程序。它主要产生一个 SQL 脚本文件,其中包含从头重新创建数据库所必需的命令 CREATE
TABLE
INSERT
等。
使用 mysqldump
备份的语句:
mysqldump -u root 数据库名>备份文件名; #备份整个数据库
mysqldump -u root 数据库名 表名字>备份文件名; #备份整个表
mysqldump 是一个备份工具,因此该命令是在终端中执行的,而不是在 mysql 交互环境下
尝试备份整个数据库 mysql_shiyan,将备份文件命名为 bak.sql,输入命令:
cd /home/shiyanlou/
mysqldump -u root mysql_shiyan > bak.sql;
使用命令 “ls” 可见已经生成备份文件 bak.sql:
查看备份文件的内容,可以看见里面不仅保存了数据,还有所备份的数据库的其它信息。
恢复
用备份文件恢复数据库,其实我们早就使用过了。在本次实验的开始,我们使用过这样一条命令:
source /home/shiyanlou/Desktop/MySQL-06.sql
这就是一条恢复语句,它把 MySQL-06.sql 文件中保存的 mysql_shiyan 数据库恢复。
还有另一种方式恢复数据库,但是在这之前我们先使用命令新建一个空的数据库 test:
CREATE DATABASE test; #新建一个名为test的数据库
再次 Ctrl+D 退出 MySQL,然后输入语句进行恢复,把刚才备份的 bak.sql 恢复到 test 数据库:
mysql -u root test < bak.sql
我们输入命令查看 test 数据库的表,便可验证是否恢复成功:
use test # 连接数据库 test
SHOW TABLES; # 查看 test 数据库的表
可以看见原数据库的 4 张表和 1 个视图,现在已经恢复到 test 数据库中:
再查看 employee 表的恢复情况:
山东青岛唐岛湾国家湿地公园位于山东省青岛市经济技术开发区, [1] 包括唐岛湾内湾浅海水域、滩涂及其周边50-100米缓冲区域,规划总面积1637.6公顷,其中湿地面积 1312.8公顷,占湿地公园总面积的80.2%,包括近海和海岸湿地、人工湿地两大类,涉及浅海水域、沙石海滩、淤泥质海滩、河口水域、库塘、运河输水河
山东青岛唐岛湾国家湿地公园位于山东省青岛市经济技术开发区, [1] 包括唐岛湾内湾浅海水域、滩涂及其周边50-100米缓冲区域,规划总面积1637.6公顷,其中湿地面积 1312.8公顷,占湿地公园总面积的80.2%,包括近海和海岸湿地、人工湿地两大类,涉及浅海水域、沙石海滩、淤泥质海滩、河口水域、库塘、运河输水河和水产养殖场7个湿地型,涵盖了淡水、咸-淡水和咸水序列,湿地类型多样,湿地特征典型,生态系统保存良好,在中国北方沿海港湾区域中具有典型性和代表性,有较高的科学和保护价值。
和水产养殖场7个湿地型,涵盖了淡水、咸-淡水和咸水序列,湿地类型多样,湿地特征典型,生态系统保存良好,在中国北方沿海港湾区域中具有典型性和代表性,有较高的科学和保护价值。
山东青岛唐岛湾国家湿地公园位于山东省青岛市经济技术开发区, [1] 包括唐岛湾内湾浅海水域、滩涂及其周边50-100米缓冲区域,规划总面积1637.6公顷,其中湿地面积 1312.8公顷,占湿地公园总面积的80.2%,包括近海和海岸湿地、人工湿地两大类,涉及浅海水域、沙石海滩、淤泥质海滩、河口水域、库塘、运河输水河和水产养殖场7个湿地型,涵盖了淡水、咸-淡水和咸水序列,湿地类型多样,湿地特征典型,生态系统保存良好,在中国北方沿海港湾区域中具有典型性和代表性,有较高的科学和保护价值。
我是一名来自帝都985高校的机械研究生
本号专注于分享工科专业学习考试攻略、程序员学习求职经验、教师求职考试经验等相关内容,同时还会兼顾生活向,欢迎大家的关注和转发!