深入解析MySQL视图、索引、数据导入导出:优化查询和提高效率

news2024/9/22 15:36:02

目录

1. 视图(View):

什么是视图?

为什么要使用视图?

视图的优缺点

1) 定制用户数据,聚焦特定的数据

2) 简化数据操作

3) 提高数据的安全性

4) 共享所需数据

5) 更改数据格式

6) 重用 SQL 语句

示例操作

没使用前

使用后

2. 索引(Index):

什么是索引?

为什么要使用索引?

1) 顺序访问

2) 索引访问

索引的优缺点【重点】

优点

缺点

什么时候不使用索引

索引何时失效【重点】

索引分类

1) 普通索引

2) 唯一索引

3) 主键索引

4) 组合索引:

3. 数据导入导出:

什么是数据导入导出?

为什么要使用数据导入导出?

示例操作

导出

手动导出

 dom命令出

导出表数据和表结构

 只导出表结构

导入

LOAD DATA INFILE 导入导出

【注意】


1. 视图(View):

什么是视图?

  1. 视图是基于一个或多个表的查询结果集,类似于虚拟表。它是一个虚拟的表,没有实际的存储数据,通过查询定义的,可以像表一样查询和使用。
  2. 视图可以用于简化复杂的查询操作,隐藏底层表结构细节,提供更简洁易读的查询接口
  3. 视图还可以用于限制用户对数据的访问权限,通过授权不同的视图给不同的用户实现数据安全性控制

 创建视图语法:

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

语法说明如下:

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

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

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

为什么要使用视图?

视图提供了数据封装和抽象的能力,可以简化复杂查询隐藏细节、实现安全性控制提高数据访问的灵活性

视图的优缺点

1) 定制用户数据,聚焦特定的数据

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


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

2) 简化数据操作

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

3) 提高数据的安全性

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

4) 共享所需数据

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

5) 更改数据格式

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

6) 重用 SQL 语句

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

示例操作

没使用前

sql语句长 

SELECT * from 
t_mysql_score sc,
t_mysql_course c,
t_mysql_teacher t,
t_mysql_student s
where sc.cid = c.cid
and sc.sid = s.sid
and c.tid = t.tid

结果:

使用后

我们利用

CREATE VIEW v_student_score as
SELECT * from 
t_mysql_score sc,
t_mysql_course c,
t_mysql_teacher t,
t_mysql_student s
where sc.cid = c.cid
and sc.sid = s.sid
and c.tid = t.tid

创建之后会出现一个错误

代表了很多重复的意思 ,我们更改*s.*,c.*,t.tname,sc.score

CREATE VIEW v_student_score as
SELECT s.*,c.*,t.tname,sc.score from 
t_mysql_score sc,
t_mysql_course c,
t_mysql_teacher t,
t_mysql_student s
where sc.cid = c.cid
and sc.sid = s.sid
and c.tid = t.tid

结果:

利用查询语句查询视图

SELECT * from v_student_score

 

2. 索引(Index):

什么是索引?

索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。

  1. 索引可以根据一个或多个列的值进行排序和搜索,提高查询时的效率。
  2. MySQL索引(Index)是一种特殊的数据结构,建立在表的列上,旨在加快数据库查询的速度
  3. 通过在索引列上创建索引,数据库可以更快地定位和访问特定值,而无需扫描整个数据表。
  4. 索引可以应用于单个列或多个列的组合,可以按升序降序排序
  5. 常见的索引类型包括主键索引、唯一索引、普通索引等。

   创建索引:

CREATE [UNIQUE|FULLTEXT] INDEX 索引名 ON 表名(字段名[(长度)][ASC|DESC])

为什么要使用索引?

索引可以加快数据库查询的速度提高查询效率特别是在大数据量的情况下,可以显著减少查询的时间

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

1) 顺序访问

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

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

2) 索引访问

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

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

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

索引的优缺点【重点

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

优点

索引的优点如下:

  • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
  • 可以给所有的 MySQL 列类型设置索引。
  • 可以大大加快数据的查询速度,这是使用索引最主要的原因。
  • 在实现数据的参考完整性方面可以加速表与表之间的连接。
  • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

缺点

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

  • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

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

什么时候不使用索引

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

索引何时失效【重点

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

索引分类

创建日志文件

CREATE TABLE `t_log` (
  `id` varchar(32) NOT NULL COMMENT '唯一标识',
  `ip` varchar(15) NOT NULL COMMENT 'IP地址',
  `userid` varchar(32) NOT NULL COMMENT '用户ID',
  `moduleid` varchar(32) NOT NULL COMMENT '模块ID',
  `content` varchar(500) NOT NULL COMMENT '日志内容',
  `createdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',
  `url` varchar(100) DEFAULT NULL COMMENT '请求URL地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后导入我们的文件t_log.sql

【ps】文件里的数据均为虚拟数据

1) 普通索引

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

select COUNT(1) from t_log    -- 用时:0.026s


建索引前  0.11s

select * from t_log where moduleid = '100301';


创建索引所花费的时间: 1.132s

Create index idx_moduleid on t_log(moduleid);


建索引后 0.001s

select * from t_log where moduleid = '100301';

  删除索引  0.014s

drop index idx_moduleid on t_log

可以查看走过的索引

EXPLAIN select * from t_log where moduleid = '100301';

有索引

无索引

2) 唯一索引

与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值如果是组合索引,则列值的组合必须唯一;

 
-- Duplicate entry '/quartz/queryJobLst' for key 'idx_url'    有重复列段
-- 创建
create UNIQUE index idx_url on t_log(url);
-- 删除
drop index idx_url on t_log;
我们的 t_log里面的 url有很多的 /quartz/queryJobLst数据

3) 主键索引

是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;

我们的id主键所以查询的时间还是很快的
 

 -- 主键索引所花费的时间:0s
select * from t_log where id = '07489cdafd6d4a3489884cd3c00c7b27';
EXPLAIN select * from t_log where id = '07489cdafd6d4a3489884cd3c00c7b27';


4) 组合索引:

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


用的最左原则,看似有多个索引,其实走了一个索引,走的是左边第一个索引

-- 花费的时间:2.965s
create index idx_userid_moduleid_url on t_log(userid,moduleid,url);


-- 走组合索引
EXPLAIN select * from t_log where userid = '' and moduleid = '' and url = '';
EXPLAIN select * from t_log where userid = '' and moduleid = '';
EXPLAIN select * from t_log where userid = '' ;
EXPLAIN select * from t_log where userid = '' and url = '';
-- 不走组合索引
EXPLAIN select * from t_log where moduleid = '';
EXPLAIN select * from t_log where url = '';
EXPLAIN select * from t_log where moduleid = '' and url = '';


 

3. 数据导入导出:

什么是数据导入导出?

  1. 数据导入是将外部数据文件的数据导入到MySQL数据库中
  2. 数据导出是将MySQL数据库中的数据导出为外部数据文件,以便在其他系统或数据库中使用。
  3. 数据导入导出常用的工具有mysqldumpmysqlimport等。
  4. 数据导入导出通常用于数据迁移、数据备份和恢复、与其他系统进行数据交换等场景。
  5. 数据导入导出的文件格式可以是纯文本格式,也可以是其他数据库可识别的格式如SQL文件。

   数据导入:
   使用LOAD DATA INFILE语句导入纯文本数据文件:

LOAD DATA INFILE 'path_to_file' INTO TABLE table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

   数据导出:
  使用SELECT ... INTO OUTFILE语句将查询结果导出为纯文本数据文件:

SELECT column1, column2, ... INTO OUTFILE 'path_to_file' FROM table_name;

为什么要使用数据导入导出?

数据导入导出允许将数据从一个系统迁移到另一个系统,进行备份和恢复,与其他系统进行数据交换和共享

示例操作

导出

手动导出

选择需要导的表,然后右键,转储SQL文件,结构和数据,保存即可

在数据多的情况下,我们导出的时间就需要很多



 

 

 dom命令出

找到我们的mysql的安装位置,找到bin文件夹,cmd进去。

导出的数据在mysqlbin目录下

导出表数据和表结构

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

  mysqldump -uroot -p123456 mybatis_ssm > 1234567.sql


我们的bin文件夹下面就有123456.sql文件

 

 只导出表结构
mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql
 
mysqldump -uroot -p -d abc > abc.sql

 

导入

为了防止多种因素,很多企业都是在dom命令建立数据库,所以我在这里也演示一下;

还是在bin文件夹里面cmd命令里面进行

mysql -u root -p

输入设置用户的密码

进去之后就可以正常使用sql语句了

注意:首先建立空数据库

mysql>create database abc;


方法一

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

方法二
 

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

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.ini 文件的 [mysqld] 代码下增加 secure_file_priv=E:/TEST 再重启 mysql 就可以了。然后在导出的地址下面写上刚才配置的这个地址 eg: select * from tb_test into outfile "D:/TEST/test.txt";就可以了。

-- 导出
select * from t_log into outfile 'D:/12345678.sql';
-- 导出
load data infile 'D:/12345678.sql' into table t_log(id,ip,userid,moduleid,content,createdate,url); 
show variables like 'secure%'
desc t_log;

select * FROM t_log;

【注意】

在使用视图、索引和数据导入导出时,需要根据具体的数据结构和业务需求进行慎重的选择和操作。此外,视图和索引的创建需要考虑数据库的性能和资源消耗,并根据实际情况进行适当的优化和管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十一.Redis发布订阅

Redis发布订阅(pub/sub)是一种消息通信模式&#xff1a;发布者(pub)发送消息&#xff0c;订阅者(sub)接受消息。此种模式下&#xff0c;消息发布者和订阅者不进行直接通信&#xff0c;发布者客户端向指定的频道&#xff08;channel&#xff09; 发布消息&#xff0c;订阅该频道…

【MQTT】Esp32数据上传采集:最新mqtt插件(支持掉线、真机调试错误等问题)

前言 这是我在Dcloud发布的插件-最完整Mqtt示例代码&#xff08;解决掉线、真机调试错误等问题&#xff09;&#xff0c;经过整改优化和替换Mqtt的js文件使一些市场上出现的问题得以解决&#xff0c;至于跨端出问题&#xff0c;可能原因有很多&#xff0c;例如&#xff0c;合法…

MySQL基础篇第3章(基本的SELECT语句)

文章目录 1、SQL概述1.1 SQL背景知识1.2 SQL分类 2、SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 &#xff08;建议遵守&#xff09;2.3 注释2.4 命名规则2.5 数据导入指令 3、基本的SELECT语句3.0 SELECT...3.1 SELECT...FROM3.2 列的别名3.3 去除重复行3.4 空置参与运…

营销人累了看看这5部影片吧!保你再燃激情

市场瞬息万变&#xff0c;做营销需不断学习充电&#xff0c;除了看书听课之外看电影也是学习营销的有效方式。今天小马识途营销顾问给大家推荐5部市场营销人员必看的高评分电影&#xff0c;相信看完之后&#xff0c;会对你今后的发展影响深远&#xff01;话不多说直接上干货&am…

并发编程 - Event Driven 设计模式(EDA)

文章目录 EDA 概述初体验EventEvent HandlersEvent Loop 如何设计一个Event-Driven框架同步EDA框架设计MessageChannelDynamic RouterEventEventDispatcher测试同步EDA架构类图 异步EDA框架设计抽象基类 AsyncChannelAsyncEventDispatcher 并发分发消息测试 EDA 概述 EDA&…

【计算机网络】第 2 课 - 计算机网络的性能指标

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、性能指标 2.1、速率 2.2、带宽 2.3、吞吐量 2.4、时延 2.5、时延带宽积 2.6、往返时间 2.7、利用率 2.8、丢…

【Cartopy学习系列】Cartopy中的投影类型总结

一、PlateCarree&#xff08;圆柱投影&#xff09; PlateCarree 是Cartopy的默认投影&#xff0c;投影将地物投影到圆柱面上再展开&#xff0c;常用来绘制世界地图。该投影具有经线或纬线方向等度数的特点&#xff0c;亦称等经纬度投影。 class cartopy.crs.PlateCarree(cent…

【Kafka】Kafka消费者

【Kafka】Kafka消费者 文章目录 【Kafka】Kafka消费者1. 消费方式1.1 消费者工作流程1.2 消费者组原理1.3 消费者组初始化流程1.4 消费者组详细消费流程1.5 消费者重要参数 2. 消费者API2.1 独立消费者案例2.2 订阅分区2.3 消费者组案例 1. 消费方式 pull(拉)模式&#xff1a;…

Linux上查看外接USB设备类型

最近遇到一个问题&#xff0c;需要在shell脚本中识别当前显示器的USB触屏线是否插入&#xff0c;并读取显示器名称&#xff0c;以确定是否是想要的。 解决思路&#xff1a; lsusb命令可以列出所有的外接USB设备&#xff1a; 其中 “Atmel Corp. Atmel maXTouch Digitizer” 即为…

rabbitmq使用springboot实现direct模式

一、 Direct模式 类型&#xff1a;direct特点&#xff1a;Direct模式是fanout模式上的一种叠加&#xff0c;增加了路由RoutingKey的模式。 二、coding Ⅰ 生产者 1、引入相应的pom文件 pom.xml <?xml version"1.0" encoding"UTF-8"?> <pro…

Linux 学习记录48(QT篇待完成)

Linux 学习记录48(QT篇) 本文目录 Linux 学习记录48(QT篇)一、1.2. 二、三、四、练习1. 自制文本编辑器(0. main.cpp(1. txt_window.h(2. txt_window.cpp 2. 登录界面完善 一、 1. 2. 二、 三、 四、 练习 1. 自制文本编辑器 (0. main.cpp #include "txt_window.h…

JavaWeb 笔记——5

JavaWeb 笔记——5 一、Filter1.1、概述1.2、Filter快速入门1.3、Filter执行流程1.4、Filter使用细节1.5、Filter-案例-登陆验证 二、Listener2.1、Listener概述与分类2.2、ServletContextListener使用 三、AJAX3.1、AJAX概述3.2、AJAX快速入门3.3、使用Ajax验证用户名是否存在…

《阿里大数据之路》研读笔记(3)事实表

不理解可以先看看这个例子 例子里的start_time可以看成下单时间 end看成确认收货时间 这个例子中累计快照事实表和拉链表类似 图解HIVE累积型快照事实表_累积快照事实表_小基基o_O的博客-CSDN博客 累计快照事实表 我的理解是 根据上面的例子 就是一行代表多个业务过程 每个…

day18 哈希表

题目一&#xff1a;两个数组的交集 题目描述 int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){//哈希表 int arr_hash[1000] {0};int *arr_result (int *)malloc(sizeof(int)* nums1Size);*returnSize 0;for(int i 0;i < nu…

强化学习|底层逻辑与本质 引导式学习

强化学习的本质是什么&#xff0c;底层逻辑是什么&#xff1f; 强化学习的本质是一个智能体通过与环境的交互&#xff0c;通过尝试和错误的方式学习如何采取行动来最大化累积奖励。它的底层逻辑基于马尔可夫决策过程&#xff08;Markov Decision Process&#xff0c;MDP&#x…

【C++进阶之路】模拟实现string类

前言 本文所属专栏——【C进阶之路】 上一篇,我们讲解了string类接口的基本使用&#xff0c;今天我们就实战从底层实现自己的string类&#xff0c;当然实现所有的接口难度很大&#xff0c;我们今天主要实现的常用的接口~ 一、String类 ①要点说明 1.为了不与库里面的string冲…

※Redis的事务、乐观锁和悲观锁

1.是神魔 在高并发的环境下&#xff0c;多个线程去竞争同一个资源&#xff0c; 比较常见的有高铁抢票系统&#xff0c;商品秒杀系统等&#xff0c;我们需要保证数据正确&#xff0c;同时系统的吞吐也要尽可能高。2.解决方案 1. 一般多线程同步我们就会想到加锁&#xff0c;用…

c语言进阶-文件的打开和读写

本节重点知识点 为什么使用文件 什么是文件 文件名的组成 操作文件的基本过程 文件的打开与关闭 文件打开函数&#xff1a; 参数介绍 打开文件的方式&#xff1a; 使用绝对路径和相对路径都可以打开文件 文件的顺序读写函数&#xff1a; 写文件模式下&#xff0c;在打开文件fo…

-XX:NewSize=20m -XX:MaxNewSize=40m,-Xmn30m,-XX:NewRatio=5

高优先级&#xff1a;-XX:NewSize -XX:MaxNewSize设置新生代初始值&#xff0c;最大值中优先级&#xff1a;-Xmn&#xff08;默认等效 -Xmn-XX:NewSize-XX:MaxNewSize?&#xff09;设置新生代初始值-XX:NewRatio设置老年代和新生代的比例&#xff1b;例如&#xff1a;-XX:NewR…

CMake+OpenMP加速运算测试

目录 写在前面代码编译运行关于加速效果参考完 写在前面 1、本文内容 cmake编译测试openmp的效果 2、平台/环境 windows/linux均可&#xff0c;cmake 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/details/131629705 代码 代码包含同样的for循…