数据库学习案例20240304-mysql数据库案例总结(碎片,统计信息)

1  表中的碎片

         在InnoDB中删除行的时候,这些行只是被标记为“已删除”,而不是真正从物理存储上进行了删除,因而存储空间也没有真正被释放回收。InnoDB的Purge线程会异步地来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操作系统重新使用,这样会导致页面中存在很多空洞。如果表结构中包含动态长度字段,那么这些空洞甚至可能不能这样被InnoDB重新用来存储新的行。另外,删除数据就会导致页(Page)中出现空白空间,大量随机的DELETE操作,必然会在数据文件中造成不连续的空白空间。而当插入数据时,这些空白空间则又会被利用起来,于是造成了数据的存储位置不连续。物理存储顺序与逻辑上的排序不同,这种就是数据碎片。

对于大量的UPDATE,也会造成文件碎片化,InnoDB的最小物理存储分配单位是页(Page),而UPDATE也可能导致页分裂(Page Split)。频繁的页分裂,页会变得稀疏,并且被不规则地填充,所以最终数据会有碎片。

要计算表中碎片的大小,可以采用下面的计算公式。

下面通过具体的示例来演示如何计算表的碎片大小以及如何清理表的碎片。
1)查看表的状态信息,例如这里使用表“t”。

04:25:  [mgr]> show table status like '%t%'\G
*************************** 1. row ***************************
           Name: t
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 4
 Avg_row_length: 4096
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-03-04 04:23:47
    Update_time: 2024-03-04 04:24:09
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

2)以上面的数据为例,计算表中的碎片大小。

((Data_length+ Index_length)-rows*Avg_row_length)/1024

3)执行下面的语句清理碎片。

04:25:  [mgr]> alter table t engine=innodb;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

提示
除了使用alter table语句清理碎片以外,还可以使用以下的两种方式。
·备份原表数据,然后删除原表并创建一张与原表相同的新表,再将备份的数据导入新表中。
·使用第三方工具pt-online-schema-change进行在线整理表结构、收集碎片等操作。

2  统计schema大小

04:40:  [mgr]> SELECT TABLE_SCHEMA,(MAX(DATA_LENGTH)/1024/1024 +SUM(INDEX_LENGTH)/1024/1024) usersize FROM INFORMATION_SCHEMA.TABLES GROUP BY TABLE_SCHEMA;
+-------------------------------+------------+
| TABLE_SCHEMA                  | usersize   |
+-------------------------------+------------+
| mysql                         | 1.84375000 |
| information_schema            | 0.00000000 |
| performance_schema            | 0.00000000 |
| sys                           | 0.01562500 |
| mgr                           | 0.01562500 |
| mysql_innodb_cluster_metadata | 0.15625000 |
+-------------------------------+------------+
6 rows in set (0.01 sec)

3 查看每个schenma前10大小的表

SELECT 
TABLE_SCHEMA AS dbname,
TABLE_NAME AS tablename,
TABLE_ROWS AS tablerows,
ENGINE AS tableengine,
ROUND((DATA_LENGTH)/1024/1024,2) AS Data_MB,
ROUND((INDEX_LENGTH)/1024/1024,2) AS Index_MB,
ROUND((DATA_LENGTH+INDEX_LENGTH)/1024/1024,2)AS Total_MB,
ROUND((DATA_FREE)/1024/1024,2)AS Free_MB
FROM information_schema.tables AS T1
WHERE T1.TABLE_SCHEMA NOT IN
('performance_schema','mysql','information_schema')
ORDER BY T1.TABLE_ROWS DESC
LIMIT 10;

4 统计信息

1 自动采集

2 手动采集

analyze table T;

04:52:  [mgr]> analyze table T;
+-------+---------+----------+----------+
| Table | Op      | Msg_type | Msg_text |
+-------+---------+----------+----------+
| mgr.t | analyze | status   | OK       |
+-------+---------+----------+----------+
1 row in set (0.00 sec)

04:56:  [mgr]> 

5 mysql临时表

MySQL临时表在需要保存一些临时数据时是非常有用的。临时表只在当前会话的连接可见,当关闭连接时,MySQL会自动删除表并释放所有空间。由于临时表只属于当前的会话,因此不同会话的临时表可以重名。如果有多个会话执行查询时,使用临时表则不会有重名的担忧。所有临时表都存储在临时表空间,并且临时表空间的数据可以复用。MySQL的InnoDB存储引擎、MyISAM存储引擎和Memory存储引擎都支持临时表。
下面通过一个具体示例来演示如何使用临时表。
1)创建一张临时表。

05:05:  [mgr]> create temporary table tem01 (id bigint primary key);
Query OK, 0 rows affected (0.00 sec)

05:05:  [mgr]> insert into tem01 values(1);
Query OK, 1 row affected (0.00 sec)

05:06:  [mgr]> insert into tem01 values(2);
Query OK, 1 row affected (0.00 sec)

05:06:  [mgr]> insert into tem01 values(3);
Query OK, 1 row affected (0.00 sec)

05:06:  [mgr]> insert into tem01 values(4);
Query OK, 1 row affected (0.00 sec)

05:06:  [mgr]> show tables;
+---------------+
| Tables_in_mgr |
+---------------+
| gp            |
| t             |
+---------------+
2 rows in set (0.00 sec)

05:08:  [mgr]> 

1 当使用“show tables”命令显示数据库列表时,将无法看到临时表。

2  MGR组复制不能复制temp表
3 切换数据库临时表数据仍然在,退出当前的会话在登陆时表已经不存在

05:08:  [mgr]> use mysql
Database changed
05:09:  [mysql]> use mgr
Database changed
05:09:  [mgr]> select *From tem01;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

05:09:  [mgr]> exit
Bye
[root@mgr01 ~]# mysql -uroot -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 54
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

05:09:  [(none)]> use mgr
Database changed
05:09:  [mgr]> select *From tem01;
ERROR 1146 (42S02): Table 'mgr.tem01' doesn't exist
05:09:  [mgr]>

6 mysql索引

mysql索引默认存储格式为B+树索引。(节点之间存在指针连接)

可以看到,与B树最大的区别就是每一个叶节点都包含指向下一个叶节点的指针,并且叶节点的指针指向的是被索引的数据,而非其他的节点。非叶节点仅具有索引作用,跟数据有关的信息均存储在叶节点中。查找时存储引擎通过根节点一层层地进行二分搜索即可。由于B+树在内部节点上不包含数据信息,所以它占用空间更小;叶节点之间形成链表,从而方便了叶节点的遍历与范围查找。

3.查看MySQL中的索引


05:15:  [mgr]> desc select *from gp;
05:15:  [mgr]> explain select * from gp;

05:20:  [mgr]> show index from t\G
*************************** 1. row ***************************
        Table: t
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
1 row in set (0.00 sec)

05:20:  [mgr]> 

7 3种变量以及mysql开发

show global variables like '%%'   --全局变量

show session variables like '%%'  --可以在会话成立的变量

show status  状态变化变量。

set session transaction isolation level read uncommitted;

set session transaction isolation level repeatable read;

set session transaction isolation level read committed;

begin

set @a=10;

select * From timeevent where id>@a;

end

8 innodb 行锁

name列在表t没有索引。

INNODB行锁是通过索引实现的,索引只有通过索引查询数据时才会使用行级锁,否则INNODB将使用表级锁。

session 1

06:12:  [mgr]> begin;
Query OK, 0 rows affected (0.00 sec)

06:12:  [mgr]> select * From t where name='123' for update;
+----+------+-------+-------+-------+
| id | name | name1 | name2 | name3 |
+----+------+-------+-------+-------+
|  1 | 123  | NULL  | NULL  | NULL  |
|  5 | 123  | NULL  | NULL  | NULL  |
+----+------+-------+-------+-------+

session 2

06:12:  [mgr]> select * from t where name='1234541111115' for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction


06:12:  [mgr]> select * From performance_schema.data_lock_waits\G
*************************** 1. row ***************************
                          ENGINE: INNODB
       REQUESTING_ENGINE_LOCK_ID: 140047863931688:24:4:7:140047743513056
REQUESTING_ENGINE_TRANSACTION_ID: 11664
            REQUESTING_THREAD_ID: 220
             REQUESTING_EVENT_ID: 27
REQUESTING_OBJECT_INSTANCE_BEGIN: 140047743513056
         BLOCKING_ENGINE_LOCK_ID: 140047863929264:24:4:7:140047743494880
  BLOCKING_ENGINE_TRANSACTION_ID: 11662
              BLOCKING_THREAD_ID: 103
               BLOCKING_EVENT_ID: 197
  BLOCKING_OBJECT_INSTANCE_BEGIN: 140047743494880
1 row in set (0.00 sec)

查看锁定

select *from information_schema.innodb_trx where trx_statte='LOCK WAIT';

select *from sys.innodb_lock_waits\G

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pydub、playsound播放声音;gradio、streamlit页面播放声音;gradio 页面图像、视频及调用摄像头

1、pydub from pydub import AudioSegment from pydub.playback import playsong AudioSegment.from_wav(r"C:\Users\loong\Downloads\zh.wav") play(song)2、playsound from playsound import playsoundplaysound(r"voice.wav")3、streamlit import s…

李沐动手学习深度学习——3.5练习

减少batch_size(如减少到1)是否会影响读取性能? 肯定会影响,计算机io性能而言,随着batch_size增大,读取越来越快,需要的时间越少。这里会涉及到计算机操作系统的知识点,内存与硬盘之…

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案:124 char s[3][10] s 是数组指针,类型为char (*)[3],所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

C/C++ 乘积尾零问题(蓝桥杯)

如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 5650,4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899…

MySQL数据库运维第一篇(日志与主从复制)

文章目录 一、错误日志二、二进制日志三、查询日志四、慢查询日志(记录超时的sql语句)五、主从复制概括六、主从复制原理七、搭建主从复制八、主从复制的测试 在这篇深入的技术文章中,作者将以明晰透彻的方式详细介绍MySQL数据库中关键的日志…

蓝桥杯——123

123 二分等差数列求和前缀和数组 题目分析 连续一段的和我们想到了前缀和,但是这里的l和r的范围为1e12,明显不能用O(n)的时间复杂度去求前缀和。那么我们开始观察序列的特点,可以按照等差数列对序列进行分块。如上图,在求前10个…

C++基于多设计模式下的同步异步日志系统day5

C基于多设计模式下的同步&异步日志系统day5 📟作者主页:慢热的陕西人 🌴专栏链接:C基于多设计模式下的同步&异步日志系统 📣欢迎各位大佬👍点赞🔥关注🚓收藏,&am…

【Vue3】3-6 : 仿ElementPlus框架的el-button按钮组件实

文章目录 前言 本节内容实现需求完整代码如下: 前言 上节,我们学习了 slot插槽,组件内容的分发处理 本节内容 本小节利用前面学习的组件通信知识,来完成一个仿Element Plus框架的el-button按钮组件实现。 仿造的地址:uhttps://…

SpringBoot接口防抖(防重复提交)的一些实现方案

前言 啥是防抖 思路解析 分布式部署下如何做接口防抖? 具体实现 请求锁 唯一key生成 重复提交判断 前言 作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统&a…

2024最新算法:鹦鹉优化算法(Parrot optimizer,PO)求解23个基准函数

一、鹦鹉优化算法 鹦鹉优化算法(Parrot optimizer,PO)由Junbo Lian等人于2024年提出的一种高效的元启发式算法,该算法从驯养的鹦鹉中观察到的觅食、停留、交流和对陌生人行为的恐惧中汲取灵感。这些行为被封装在四个不同的公式中…

《Improving Calibration for Long-Tailed Recognition》阅读笔记

论文标题 《Improving Calibration for Long-Tailed Recognition》 改进长尾识别的校准工作 作者 Zhisheng Zhong、 Jiequan Cui、Shu Liu 和 Jiaya Jia 香港中文大学和 SmartMore 初读 摘要 深度神经网络在训练数据集类别极度不平衡时可能会表现不佳。最近&#xff0c…

010 Linux 进程间通信_匿名管道

前言 本文将会向你介绍匿名管道的原理以及用法,以及管道的使用存在的情况和管道的特性 文章重点 重点:匿名管道的原理,使用情况,以及特性 进程间通信 进程间通信的本质: 让不同的进程先看到同一份资源&#xff0c…

换个角度看境外支付系统:警惕金融风险之安全测试实践

【面试突击班】1. 性能测试主要关注哪些指标? ,这个名词相信生活在当下社会的大家应该都不在陌生了吧,他时时刻刻充斥在我们的日常生活中,哪里有交易发生,哪里就有它的身影。 其实直白的来说,支付系统是扮…

数组传参调试小技巧

数组传参调试小技巧 前言正文 前言 亲爱的小伙伴们&#xff0c;你们好呀&#xff01;我是莹莹&#xff0c;今天我来给大家分享关于数组传参调试的技巧&#xff0c;希望能够帮助你们&#xff01; 正文 首先&#xff0c;我们先来看一段数组传参代码 #include<stdio.h>v…

《汇编语言》- 读书笔记 - 第16章-直接定址表

《汇编语言》- 读书笔记 - 第16章-直接定址表 16.1 描述了单元长度的标号&#xff08;数据标号&#xff09;检测点 16.1 16.2 在其他段中使用数据标号assume通过标号取地址检测点 16.2 16.3 直接定址表&#xff08;Direct Addressing Table&#xff09;例1分析代码效果 例2分析…

深入了解 Android 中的 FrameLayout 布局

FrameLayout 是 Android 中常用的布局之一&#xff0c;它允许子视图堆叠在一起&#xff0c;可以在不同位置放置子视图。在这篇博客中&#xff0c;我们将详细介绍 FrameLayout 的属性及其作用。 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/androi…

Tomcat常见配置(基础功能、虚拟主机、搭建博客)

目录 一、Tomcat基础功能 1、自动解压war包 2、Tomcat工具界面 2.1 Server Status (服务器状态) 2.1.1 本地登录状态页 2.1.2 远程登录状态页 2.2 Manager App (管理应用程序) 2.3 Host Manager (主机管理器) 3、Context 配置 二、配置虚拟主机 三、搭建 JPress 博客…

就业班 2401--2.29 Linux Day8--存储管理2(LVM)+swap+磁盘阵列raid

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;小伙伴们一定要看到最后&#xff0c;有彩蛋呢^--^ 一、存储管理Ⅱ 逻辑卷LVM &#xff08;Logical Volume Manager&#xff08;逻辑卷管理&#xff09;的简写&#xff09; LVM管理 lvm概念&#xf…

网络编程作业day4

广播模型&#xff1a; 发送端&#xff1a; #include <myhead.h> int main(int argc, const char *argv[]) {//创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}//设置套接字允许广播属性int broadcast1;if(sets…

MySQL 用户账号迁移

文章目录 前言1. 工具安装1.1 下载安装包1.2 编译安装 2. 用户迁移后记 前言 有一个典型的使用场景&#xff0c;就是 RDS 下云大多数都是通过 DTS 进行数据传输的&#xff0c;用户是不会同步到自建数据库的。需要运维人员在自建数据库重新创建用户&#xff0c;如果用户数量很多…