文章目录
- 前言 ´・ᴗ・`
- Mysql目录
- 视图view
- information_schema数据库
- mysql
- 总结 ´◡`
前言 ´・ᴗ・`
- 继上一次我们学习了事务的处理 控制语言 TCL
- 本节内容开始 将学习Mysql一些所谓的高级的内容
- 本节将会帮助你了解…
- Mysql目录有哪些 目录与初始数据库简单对应关系
- 视图的概念
- information_schema数据库
- mysql数据库
注意 mysql5.6
自带数据库有个test 而到了mysql5.7
改名为sys
Mysql目录
首先一个误区(好吧我也犯这个错误)
Mysql配置文件并不在安装目录里面 如图 C:\Program Files\MySQL\MySQL Server 5.7
而是在C:\ProgramData\MySQL\MySQL Server 5.7
这里才是存我们感兴趣的数据存储的地方(mysql是持久化的 将信息编码转为文件 存到文件系统的数据库 与redis存到内存不同) 以及配置的地方 而软件目录不过是执行程序存在的地方 换个版本就没了那么我们试着连接数据库 可见原来就存在4个数据库 如下:
有意思的是,我们只能找到三个数据库的持久化文件:
所以information_schema
去哪了?这个数据库抽象起来就是数据库 但实际实现形式是视图(view),而不是平常我们常见的基本表(具有实体的表),因此,文件系统上没有与之相关的文件相对应。
所以**视图是啥?**为啥很少听说呢?不常用呢?
视图view
我们看到这里也有视图二字 其实他确实可以用sql语句创建,而且平常我们就在和类似视图的东西打交道 比如:我们用 查询一个实体表的所有栏位的所有记录
SELECT* FROM events_stages_summary_by_host_by_event_name;
查询出来的结果就可以称为视图,
如果多表查询呢?一样 所有查出来的结果你可以理解为是视图
这就是为啥视图没有实体 他是根据别的实体 经过处理(查询操作 加密等)即时运算出来的 而不是本身具有实体存在文件中的
那么下一个问题 这玩意平常查看数据库 用的挺多的啊 不见我们用语句创建视图 使用视图呢?
因为性能
事实上当sql在操作视图时,所有数据都是从其他实体表中查出来的,使用视图并不能优化查询速度。尤其视图一般要发挥作用,自然是要实现多表查询,但是不同表的索引不一定相同,这样会衍生很多问题,牵一发而动全身,表与表之间反而耦合度增加,业务代码写起来很不方便,还降低性能,意义不大(除了方便理解?)
另外,由于数据库软件如mysql将其抽象得和普通实体表一样,无论是操作还是查看的结果,因此在业务代码中我们无法通过sql区分表和视图,这样优化也变得很困难。
当然,视图在特定场合,可以提升一定性能,但是很难把握,感觉我们这些普通人还是别尝试了2333
最后,很蛋疼的是,在mysql的优化器中,视图的代码执行路径与实体表完全不同,无法直观的预测其执行性能。
information_schema数据库
那这个information_schema到底有什么作用呢?
它提供了访问数据库元数据的方式
元数据,关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
具体来说:
- SCHEMATA表:提供了当前mysql实例中所有数据库的信息。这就是show databases的结果
- 可见 我们常见的mysql命令 其来源就是源于这些information_schema视图 当然做了一定的裁剪
- TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。对应
show tables from schemaname
命令 - COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。对应
show columns from schemaname.tablename
命令 - STATISTICS表:提供了关于表索引的信息。对应
show index from schemaname.tablename
命令 - USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
- SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
- TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
- COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
- CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。
SHOW CHARACTER SET
- COLLATIONS表:提供了关于各字符集的对照信息。
- COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。
SHOW COLLATION
- TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
- KEY_COLUMN_USAGE表:描述了具有约束的键列。
- ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
- VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
- TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
mysql
mysql库就是mysql的核心数据库
我们看到,前面的information_schema视图 很多信息又是来源于mysql表 这个表的信息更加根本 是所有配置的根本来源之一,而information_schema可以理解为对mysql的信息进一步处理,封装,使得信息更加人性化(之后自然封装成函数命令来给我们用了)
mysq库主要负责存储数据库的用户、权限设置,以及我们所用的关键字等等,也就是mysql自己需要使用的控制和管理核心信息。而我们常用的,也就是在mysql.user表中修改root用户的密码
有意思的是 mysql还有这两张表:innodb_index_stats
、innodb_table_stats
他们的作用和innodb有关:
具体来说,InnoDB 存储引擎提供了两种存储统计数据的方式:持久化(PERSISTENT)与非持久化统计数据(TRANSIENT)
- 持久化(PERSISTENT)统计数据,存储在 mysql.innodb_index_stats 和 mysql.innodb_table_stats 表中。这种统计数据存储在磁盘上 持久化了(mysql是实体库)
- 非持久化(TRANSIENT)统计数据,存储在 information_schema.statistics 和 information_schema.tables 中。这种统计数据存储在内存中,当服务器关闭时这些这些统计数据就都被清除掉了,等到服务器重启之后,在某些适当的场景下才会重新收集这些统计数据。
目前持久化的存储统计数据是主流 mysql默认也是持久化的
不过除了dba 貌似没什么人关注mysql库各个表的功能 资料很少
有兴趣的兄弟可以研究一下 我也就碰到问题再解决他们吧
总结 ´◡`
Mysql目录有哪些 目录与初始数据库简单对应关系
视图的概念
information_schema数据库
mysql数据库