mysql中SELECT * FROM v_表名,什么用法

mysql中SELECT * FROM v_表名,什么用法,第1张

这是一种命名习惯,数据视图的英文名是view,下面是视图的基本信息:

Q:什么是视图?视图是干什么用的?

A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。(基表:用来创建视图的表叫做基表base table)

Q:为什么要使用视图?

A:因为视图的诸多优点,如下

1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

因为视图英文名是view,所以一般建视图会以首字母v_表名来命名。你的mysql数据库中肯定有一个叫v_datamsg的视图表(基表是a_datamsg和b_datamsg,所以有两个表的数据),要查看所有视图表可以用这个命令:SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

请采纳,谢谢

方法如下,以oracle为例:

select from all_tables WHERE owner='SCOTT' ;或者

SELECT FROM DBA_TABLES WHERE OWNER='SCOTT';

数据字典视图

表和列

DBA_TABLES、ALL_TABLES和USER_TABLES显示了有关数据库表的一般信息。

DBA_TAB_COLUMNS、ALL_TAB_COLUMNS和USER_TAB_COLUMNS显示了每个数据库表的列的信息。

注意:DBA_OBJECTS、ALL_OBJECTS和USER_OBJECTS显示了模式对象的信息,包括表。

MySQL 在崩溃恢复时,会遍历打开所有 ibd 文件的 header page 验证数据字典的准确性,如果 MySQL 中包含了大量表,这个校验过程就会比较耗时。 MySQL 下崩溃恢复确实和表数量有关,表总数越大,崩溃恢复时间越长。另外磁盘 IOPS 也会影响崩溃恢复时间,像这里开发库的 HDD IOPS 较低,因此面对大量的表空间,校验速度就非常缓慢。另外一个发现,MySQL 8 下正常启用时居然也会进行表空间校验,而故障恢复时则会额外再进行一次表空间校验,等于校验了 2 遍。不过 MySQL 80 里多了一个特性,即表数量超过 5W 时,会启用多线程扫描,加快表空间校验过程。

如何跳过校验MySQL 57 下有方法可以跳过崩溃恢复时的表空间校验过程嘛?查阅了资料,方法主要有两种:

1 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那么 validate = false,即可以跳过表空间校验。实际测试的时候设置 innodb_force_recovery =1,也就是强制恢复跳过坏页,就可以跳过校验,然后重启就是正常启动了。通过这种临时方式可以避免崩溃恢复后非常耗时的表空间校验过程,快速启动 MySQL,个人目前暂时未发现有什么隐患。2 使用共享表空间替代独立表空间这样就不需要打开 N 个 ibd 文件了,只需要打开一个 ibdata 文件即可,大大节省了校验时间。自从听了姜老师讲过使用共享表空间替代独立表空间解决 drop 大表时性能抖动的原理后,感觉共享表空间在很多业务环境下,反而更有优势。

临时冒出另外一种解决想法,即用 GDB 调试崩溃恢复,通过临时修改 validate 变量值让 MySQL 跳过表空间验证过程,然后让 MySQL 正常关闭,重新启动就可以正常启动了。但是实际测试发现,如果以 debug 模式运行,确实可以临时修改 validate 变量,跳过表空间验证过程,但是 debug 模式下代码运行效率大打折扣,反而耗时更长。而以非 debug 模式运行,则无法修改 validate 变量,想法破灭。

MySQL 57 已经开发两年了。相比 MySQL 56,有特别多的改进。团队主要关注速度,性能据报告是比之前版本提升了 2 至 3 倍!

新特性列表,主要改进:

提升 MySQL 安全性

改进了安装程序

MySQL 56 中,mysql_install_db 在数据库创建的时候提供选项来生成 random password。

MySQL 574 中,可以跳过 -skip-random-password 选项来默认生成随机密码。

MySQL 575 中,还是默认生成随机密码,但是选项修改为 –insecure

而现在,MySQL 576 废弃了 mysql_install_db,使用 mysqld –initialize (formerly known as “mysqld –bootstrap,” now deprecated) 替代。

传统情况

我们先回顾一下,在没有 "立刻加列" 功能时,加列 *** 作是怎么完成的。我们也借此来熟悉一下本期的图例:

当进行 加列 *** 作 时,所有的数据行 都必须要 增加一段数据(图中的 列 4 数据)

如上一期图解所讲,当改变数据行的长度,就需要 重建表空间(图中灰蓝的部分为发生变更的部分)

数据字典中的列定义也会被更新

以上 *** 作的问题在于 每次加列 *** 作都需要重建表空间,这就需要大量 IO以及大量的时间

立刻加列

"立刻加列" 的过程如下图:

"立刻加列" 时,只会变更数据字典中的内容,包括:

在列定义中增加 新列的定义

增加 新列的默认值

"立刻加列" 后,当要读取表中的数据时:

由于 "立刻加列" 没有 变更行数据,读取的行数据只有 3 列

MySQL 会将 新增的第 4 列的默认值,追加到 读取的数据后

以上过程描述了 如何读取 在 "立刻加列" 之前写入的数据,其实质是:在读取数据的过程中,"伪造" 了一个新列出来

那么如何读取 在 "立刻加列" 之后 写入的数据呢 过程如下图:

当读取 行 4 时:

通过判断 数据行的头信息中的instant 标志位,可以知道该行的格式是 "新格式":该行头信息后有一个新字段 "列数"

通过读取 数据行的 "列数" 字段,可以知道 该行数据中多少列有 "真实" 的数据,从而按列数读取数据

通过上图可以看到:读取 在"立刻加列" 前/后写入的数据是不同的流程

通过以上的讨论,我们可以总结 "立刻加列" 之所以高效的原因是:

在执行 "立刻加列" 时,不变更数据行的结构

读取 "旧" 数据时,"伪造" 新增的列,使结果正确

写入 "新" 数据时,使用了新的数据格式(增加了instant标志位 和 "列数" 字段),以区分新旧数据

读取 "新" 数据时,可以如实读取数据

那么 我们是否能一直 "伪造" 下去  "伪造" 何时会被拆穿

考虑以下场景:

用 "立刻加列" 增加列 A

写入数据行 1

用 "立刻加列" 增加列 B

写入数据行 2

删除列 B

我们推测一下 "删除列 B" 的最小代价:需要修改 数据行中的instant标志位或 "列数" 字段,这至少会影响到 "立刻加列" 之后写入的数据行,成本类似于重建数据

从以上推测可知:当出现 与 "立刻加列"  *** 作不兼容 的 DDL *** 作时,数据表需要进行重建,如下图所示:

扩展思考题:是否能设计其他的数据格式,取代instant标志位和 "列数" 字段,使得 加列/删列 *** 作都能 "立刻完成" (提示:考虑 加列 - 删列 - 再加列 的情况)

使用限制

在了解原理之后,我们来看看 "立刻加列" 的使用限制,就很容易能理解其中的前两项:

"立刻加列" 的加列位置只能在表的最后,而不能加在其他列之间

在元数据中,只记录了 数据行 应有多少列,而没有记录 这些列 应出现的位置。所以无法实现指定列的位置

"立刻加列" 不能添加主键列

加列 不能涉及聚簇索引的变更,否则就变成了 "重建" *** 作,不是 "立刻" 完成了

"立刻加列"不支持压缩的表格式

按照 WL 的说法:"COMPRESSED is no need to supported"(没必要支持不怎么用的格式)

总结回顾

我们总结一下上面的讨论:

"立刻加列" 之所以高效的原因是:

在执行 "立刻加列" 时,不变更数据行的结构

读取 "旧" 数据时,"伪造" 新增的列,使结果正确

写入 "新" 数据时,使用了新的数据格式 (增加了 instant 标志位 和 "列数" 字段),以区分新旧数据

读取 "新" 数据时,可以如实读取数据

"立刻加列" 的 "伪造" 手法,不能一直维持下去。当发生 与 "立刻加列" *** 作不兼容 的 DDL 时,表数据就会发生重建

回到之前遗留的两个问题:

"立刻加列" 是如何工作的

我们已经解答了这个问题

所谓 "立刻加列" 是否完全不影响业务,是否是真正的 "立刻" 完成

可以看到:就算是 "立刻加列",也需要变更 数据字典,那么 该上的锁还是逃不掉的。也就是说 这里的 "立刻" 指的是 "不变更数据行的结构",而并非指 "零成本地完成任务"

1、首先打开mysql数据库软件进入软件主界面。

2、然后再左侧树里打开自己的的数据库。

3、然后需要点击需要备份的数据库名。

4、如图所示为打开数据库后界面。

5、然后需要点击转储sql文件选项。

6、然后需要打开选择存储文件路径并选择保存。

7、点击保存即可在路径备份好格式为sql的数据库文件。

一、系统表空间

在 MySQL 数据目录下有一个名为 ibdata1 的文件,可以保存一张或者多张表。

923275 12M -rw-r----- 1 mysql mysql 12M 3月 18 10:42 ibdata1

这个文件就是 MySQL 的系统表空间文件,默认为 1 个,可以有多个,只需要在配置文件 mycnf 里面这样定义即可。

innodb_data_file_path=ibdata1:200M;ibdata2:200M:autoextend:max:800M系统表空间不仅可以是文件系统组成的文件,也可以是非文件系统组成的磁盘块,比如裸设备,定义也很简单innodb_data_file_path=/dev/nvme0n1p1:3Gnewraw;/dev/nvme0n1p2:2Gnewraw

系统表空间里都有些啥内容?

具体内容包括:double writer buffer、 change buffer、数据字典(MySQL 80 之前)、表数据、表索引。

那 MySQL 为什么现在主流版本默认都不是系统表空间?

究其原因,系统表空间有三个最大的缺点:原因 1:无法做到自动收缩磁盘空间,造成很大的空间浪费。即使它包含的表都被删掉,这部分空间也不会自动释放。

二、单表空间

单表空间不同于系统表空间,每个表空间和表是一一对应的关系,每张表都有自己的表空间。具体在磁盘上表现为后缀为 ibd 的文件。比如表 t1,对应的表空间文件为 t1ibd917107 96K -rw-r----- 1 mysql mysql 96K 3月 18 16:13 t1ibd

单表空间如何应用到具体的表呢?

有两种方式:方式 1:在配置文件中开启。在配置文件中开启单表空间设置参数 innodb_filer_per_table,这样默认对当前库下所有表开启单表空间。innodb_file_per_table=1另外也可以直接建表时指定单表空间mysql> create table t1 (id int, r1 char(36)) tablespace innodb_file_per_table;

Query OK, 0 rows affected (004 sec)

单表空间除了解决之前说的系统表空间的几个缺点外,还有其他的优点,详细如下:

1 truncate table *** 作比其他的任何表空间都快;

2 可以把不同的表按照使用场景指定在不同的磁盘目录;

比如日志表放在慢点的磁盘,把需要经常随机读的表放在 SSD 上等。

mysql> create table ytt_dedicated (id int) data directory = '/var/lib/mysql-files';

Query OK, 0 rows affected (004 sec)3 可以用 optimize table 来收缩或者重建经常增删改查的表。一般过程是这样的:建立和原来表一样的表结构和数据文件,把真实数据复制到临时文件,再删掉原始表定义和数据文件,最后把临时文件的名字改为和原始表一样的。

三、通用表空间

通用表空间先是出现在 MySQL Cluster 里,也就是 NDB 引擎。从 MySQL 57 引入到 InnoDB 引擎。通用表空间和系统表空间一样,也是共享表空间。每个表空间可以包含一张或者多张表,也就是说通用表空间和表之间是一对多的关系。

以上就是关于mysql中SELECT * FROM v_表名,什么用法全部的内容,包括:mysql中SELECT * FROM v_表名,什么用法、怎么获得mysql数据库中某个表的名称、mysql数据库崩溃的原因等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9758767.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存