首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL关于数据字典的一个疑问

MySQL关于数据字典的一个疑问

作者头像
jeanron100
发布于 2018-03-22 07:28:24
发布于 2018-03-22 07:28:24
9970
举报

今天看着MySQL的数据字典,突然想到一个问题:为什么MySQL数据字典 information_schema中的表名是大写,而performance_schema和其他库中的是小写?

带着这个问题,我开始了一些猜测和自我论证。

首先大小写的这个情况是相对不兼容的。

比如在performance_schema中,根据关键字user可以找到两个相关的表。

代码语言:javascript
AI代码解释
复制
mysql> show tables  like 'user%';
+--------------------------------------+
| Tables_in_performance_schema (user%) |
+--------------------------------------+
| user_variables_by_thread             |
| users                                |
+--------------------------------------+
2 rows in set (0.00 sec)

但是如果我改做大写,是不能识别的,这在其他的数据库里也是类似的处理方式。

代码语言:javascript
AI代码解释
复制
mysql> desc USERS;
ERROR 1146 (42S02): Table 'performance_schema.USERS' doesn't exist
mysql> select database();
+--------------------+
| database()         |
+--------------------+
| performance_schema |
+--------------------+
1 row in set (0.00 sec)

而在information_schema中,则是相对兼容的。

代码语言:javascript
AI代码解释
复制
mysql> select count(*)from tables; select count(*)from TABLES;
+----------+
| count(*) |
+----------+
|      383 |
+----------+
1 row in set (0.01 sec)
+----------+
| count(*) |
+----------+
|      383 |
+----------+
1 row in set (0.00 sec)

如果从物理文件的角度来看,你会发现在MySQL中information_schema这个数据库和其他数据库不同,没有一个指定的目录存在。

代码语言:javascript
AI代码解释
复制
[root@dev01 mysql]# ll
total 188796
-rw-r----- 1 mysql mysql       56 Jan  2 12:37 auto.cnf
-rw-r----- 1 mysql mysql        5 Mar 13 14:26 dev01.pid
drwxr-x--- 2 mysql mysql    12288 Mar  9 10:44 devopsdb
drwxr-x--- 2 mysql mysql     4096 Jan  2 12:38 dms_metadata
-rw-r----- 1 mysql mysql     1292 Jan 26 19:44 ib_buffer_pool
-rw-r----- 1 mysql mysql 79691776 Mar 13 23:27 ibdata1
-rw-r----- 1 mysql mysql 50331648 Mar 13 23:27 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Mar 13 23:27 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Mar 13 23:36 ibtmp1
drwxr-x--- 2 mysql mysql     4096 Jan 24 19:04 kmp
drwxr-x--- 2 mysql mysql     4096 Jan  2 12:37 mysql
-rw-r----- 1 mysql mysql   324407 Mar 13 21:54 mysqld.log
drwxr-x--- 2 mysql mysql     4096 Jan  2 12:37 performance_schema
drwxr-x--- 2 mysql mysql    12288 Jan  2 12:37 sys
drwxr-x--- 2 mysql mysql     4096 Mar 13 23:27 test

这个数据的存储就好比Oracle里面的系统表空间,所以information_schema是名副其实的数据字典库。

而performance_schema则是一个内存库,它的存储引擎是特别的一种,不是InnoDB也不是MyISAM,Memory,而是performance_schema

带着疑问我继续切换到了information_schema中,可以很明显的发现information_schema中的数据字典大多是Memory存储引擎。

代码语言:javascript
AI代码解释
复制
mysql> show create table tables \G
*************************** 1. row ***************************
       Table: TABLES
Create Table: CREATE TEMPORARY TABLE `TABLES` (
  `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
 。。。
  `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

还要一些是InnoDB的。

代码语言:javascript
AI代码解释
复制
mysql>  show create table PLUGINS\G
*************************** 1. row ***************************
       Table: PLUGINS
Create Table: CREATE TEMPORARY TABLE `PLUGINS` (
  `PLUGIN_NAME` varchar(64) NOT NULL DEFAULT '',
  `PLUGIN_VERSION` varchar(20) NOT NULL DEFAULT '',
  `PLUGIN_STATUS` varchar(10) NOT NULL DEFAULT '',
。。。
  `LOAD_OPTION` varchar(64) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

所以数据字典的结构其实还算是比价繁杂,涉及多个存储引擎,涉及多中规则和处理方式。

如果我们仔细查看上面的语句,就会发现,这些数据字典都是temporary table.

明白了这些,对我们分析问题的方向就很有利了。

所以我的初步设想就是通过这种命名方式能够标识出来它就是临时表,避免混淆。

怎么理解呢。

如果一个数据库中存在一个临时表,一个普通表,名字都是test,可不可行?

不要猜行不行,而是快速验证一下。

代码语言:javascript
AI代码解释
复制
mysql> create table tmp (id int,name varchar(30));
Query OK, 0 rows affected (0.09 sec)
mysql> create temporary table tmp(id int,name varchar(30));

Query OK, 0 rows affected (0.00 sec)

这个时候插入一条记录,显示成功,但是我们却没有办法判断到底是插入到了哪个表里。

代码语言:javascript
AI代码解释
复制
mysql> insert into tmp values(1,'aa');
Query OK, 1 row affected (0.00 sec)

所以我们可以用排除的方式来验证,我们删掉tmp,然后查看剩下的数据到底在哪里?

删除成功,但是这个时候我们还需要其他的信息来佐证。

代码语言:javascript
AI代码解释
复制
mysql> drop table tmp ;
Query OK, 0 rows affected (0.00 sec)

查看tmp的定义信息,很明显drop的tmp是临时表。

代码语言:javascript
AI代码解释
复制
mysql> show create table tmp ;
+-------+---------------------------------------------+
| Table | Create Table                                                                                           
+-------+--------------------------------------------+
| tmp   | CREATE TABLE `tmp` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------+
1 row in set (0.00 sec)

那么插入的数据到了哪里呢,一查便知,显示为0,则很显然数据是插入到了临时表tmp中。

代码语言:javascript
AI代码解释
复制
mysql> select count(*)from tmp ;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

而如果我们继续换个思路,定义两个表,一个是大写的TABLES,一个是小写的tables

则默认的情况下也是不会冲突的,尽管tables是在数据字典层面的一个表,但是在其他数据库中依旧可以正常处理,命名还是不会冲突。

代码语言:javascript
AI代码解释
复制
mysql> create table TABLES  (id INT );
Query OK, 0 rows affected (0.12 sec)
mysql> create table tables  (id INT );
Query OK, 0 rows affected (0.11 sec)

所以这个问题的初步理解就是为了在数据字典层面作为一种清晰的标识,而如果想得到更多的信息,还是得翻翻代码的实现了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 8.0新特性: 数据字典
目前MySQL 8.0最新版本为8.0.23版本,针对8.0的新特性,从春节前开始做了一些相关学习和测试,后续会不阶段的分享一些8.0的新特性,供大家一起参考和学习;
SEian.G
2021/03/03
2.5K0
关于MySQL库表名大小写问题
一般在数据库使用规范中,我们都会看到这么一条:库名及表名一律使用小写英文。你有没有思考过,为什么推荐使用小写呢?库表名是否应该区分大小写呢?带着这些疑问,我们一起来看下本篇文章。
MySQL技术
2021/07/05
8.5K0
【MySQL数据库疑难杂症】常用的两种升级方法
动态修改innodb_fast_shutdown=0,以执行full purge(当innodb_fast_shutdown=0时,MySQL在执行关闭mysqld进程时,会对不再需要的undo log page进行清理,该清理动作非人为触发)和插入缓冲合并等操作,以干净的方式关闭MySQL。
samRsa
2025/02/11
3610
【MySQL数据库疑难杂症】常用的两种升级方法
MySQL数据字典提示1146不存在的问题解决
最近某套MySQL因为磁盘挂载问题,异常宕机,拉起后,数据库能正常访问了,但是在error.log一直提示这个错误,
bisal
2021/09/18
1.3K0
MySQL数据字典提示1146不存在的问题解决
MySQL 8.0 数据字典有哪些变化?
墨墨导读:MySQL8.0 数据字典(Data Dictionary)也在进化中。MyISAM系统表全部换成InnoDB表 ,支持原子DDL。复杂度增加了。考虑过是否跟业务数据库有资源抢夺的现象,这些都是实际使用中需要观察关注的问题。
数据和云
2020/06/17
2.4K0
MySQL 8.0新特性 — 事务性数据字典与原子DDL
事务性数据字典与原子DDL,是MySQL 8.0推出的两个非常重要的新特性,之所以将这两个新特性放在一起,是因为两者密切相关,事务性数据字典是前提,原子DDL是一个重要应用场景。
brightdeng@DBA
2020/08/17
1.9K0
MySQL 8.0新特性 — 事务性数据字典与原子DDL
mysql常用命令
这几天学习了一下mysql,对于mysql的命令总结如下,发现很多方面和oracle还是差别挺大的。 # mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.14-enterprise-commercial-advanced Copyright (c) 2000, 2013, Or
jeanron100
2018/03/13
1.2K0
Xtrabackup实现数据的备份与恢复
Xtrabackup介绍 Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。 Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup 1)xtrabackup 是专门用来备份InnoDB
企鹅号小编
2018/01/31
1.6K0
Xtrabackup实现数据的备份与恢复
MySQL和Oracle对比学习之数据字典元数据(r4笔记第33天)
MySQL和Oracle虽然在架构上有很大的不同,但是如果从某些方面比较起来,它们有些方面也是相通的。 毕竟学习的主线是MySQL,所以会从MySQL的角度来对比Oracle的一些功能。大体总结了以下的内容,欢迎大家拍砖, 查看当前的数据库名 mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | test | +------------+ 1 row in set (0.00 sec) +++ Or
jeanron100
2018/03/15
7890
MySQL(十四)之数据备份与还原
前言   上一篇分享了关于MySQL事务的知识,在我们数据库中最重要的就是数据了,所以数据的备份就显的特别的重要!   为什么要备份数据?   在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失, 大概分为以下几种:     硬件故障、软件故障、自然灾害、黑客攻击、误操作(占比例大)   所以, 为了在数据丢失之后能够恢复数据, 我们就需要定期的备份数据, 备份数据的策略要根据不同的应用场景进行定制, 大致有几个参考数值, 我们可以根据这些数值从而定制符合特定环境中的数据备份策略:     能够
用户1195962
2018/01/18
3.5K0
MySQL(十四)之数据备份与还原
详解MySQL-8.0数据字典
提示:公众号展示代码会自动折行,建议横屏阅读 ---- 1. 引言 ---- 数据字典(Data Dictionary)中存储了诸多数据库的元数据信息如图1所示,包括基本Database, table, index, column, function, trigger, procedure,privilege等;以及与存储引擎相关的元数据,如InnoDB的tablespace, table_id, index_id等。MySQL-8.0在数据字典上进行了诸多优化,本文将对其进行逐一介绍。 图1 2.
腾讯数据库技术
2019/05/16
7K0
详解MySQL-8.0数据字典
MySQL-8.0 | 数据字典最强解读
数据字典(Data Dictionary)中存储了诸多数据库的元数据信息如图1所示,包括基本Database, table, index, column, function, trigger, procedure,privilege等;以及与存储引擎相关的元数据,如InnoDB的tablespace, table_id, index_id等。MySQL-8.0在数据字典上进行了诸多优化,本文将对其进行逐一介绍。
数据和云
2019/05/13
4.3K0
4种备份MySQL数据库(基本备份方面问题不大了)
我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么比数据跟更为重要. 那么我们该如何保证数据不丢失、或者丢失后可以快速恢复呢?只要看完这篇, 大家应该就能对MySQL中实现数据备份和恢复能有一定的了解。 为什么需要备份数据? 其实在前言中也大概说明了为什么要备份数据, 但是我们还是应该具体了解一下为什么要备份数据 在生产环境中我们数据库可能会遭遇各种各样的不测从而
老七Linux
2018/05/31
3.8K0
MySQL案例:各类临时文件的存放位置
在MySQL中,存在各种各样的临时文件,其存放位置是五花八门,且不同版本也不尽相同,主要包括以下:
brightdeng@DBA
2020/09/02
7.1K1
MySQL案例:各类临时文件的存放位置
MySQL数据备份与恢复
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000003 > /opt/mysql_bin003.txt
Alone-林
2023/03/17
3.7K0
计算MySQL表碎片的SQL整理
当然整理的过程不光是知识梳理的过程,也是转化为实践场景的一个过程,通过这样一个体系,对于整个MySQL对象生命周期管理有了较为深入的认识,这里我来抛砖引玉,来作为深入学习MySQL数据字典的一个入口,这个问题就是:如何较为准确的计算MySQL碎片情况?
jeanron100
2019/09/26
3.3K0
计算MySQL表碎片的SQL整理
Docker下MySQL主从三部曲之三:binlog日志参数实战
本章是《Docker下MySQL主从三部曲》的终篇,前面的章节我们能够制作镜像来搭建主从同步环境,本章我们来观察binlog参数MASTER_LOG_POS;
程序员欣宸
2022/05/06
5430
索引(MySQL)
索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行 正确的 create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高 是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个 海量数据的检索速度。
ljw695
2025/05/31
2300
索引(MySQL)
MySQL 8.0 information_schema.tables表和之前版本的差异
在做自动化运维开发过程中,需要从information_schema.tables获取MySQL表相关的元信息,发现MySQL8.0和5.7存在的差异还是比较大的;在MySQL8.0以前,通常会通过infomation_schema的表来获取一些元数据,例如从tables表中获取表的下一个auto_increment值,从indexes表获取索引的相关信息等。
SEian.G
2021/12/13
2K0
MySQL 管理
-e选项可以在Mysql客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。
用户9615083
2022/12/25
1.5K0
MySQL 管理
相关推荐
MySQL 8.0新特性: 数据字典
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档