数据库学习案例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 - GPLCopyright (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
相关文章:
数据库学习案例20240304-mysql数据库案例总结(碎片,统计信息)
1 表中的碎片 在InnoDB中删除行的时候,这些行只是被标记为“已删除”,而不是真正从物理存储上进行了删除,因而存储空间也没有真正被释放回收。InnoDB的Purge线程会异步地来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操…...
【小白友好】LeetCode 删除并获得点数
基础题 打家劫舍https://leetcode.cn/problems/house-robber/ 小白解法 删除nums[i]就会使得所有nums[i]-1和nums[i]1的值都消失,手写了几个,发现找来找去不方便,还不如先排个序,然后这样nums[i]-1和nums[i]和nums[i]1就能靠在…...
c#委托、lambda、事件
Lambda Lambda表达式是一种匿名函数,Lambda表达式通常以箭头“>”分隔左侧的输入和右侧的输出。 (parameter_list) > { statement_block } parameter_list 是由一个或多个参数组成的逗号分隔列表,每个参数都包括类型和名称,可以为空。…...
每日一练——9×9乘法表
#include<stdio.h>int main() {int i 0; //乘数定义for (i 1; i < 9; i) //循环1到9 {int j 0;//被乘数定义for (j 1; j < i; j) //循环被乘数1到9{printf("%d*%d%2d ", i, j, i * j); 乘法}printf("\n"); 换行} return 0; }...
大白话解析LevelDB:ShardedLRUCache
文章目录 Cache 接口定义ShardedLRUCache 的实现ShardedLRUCache 的构造函数ShardedLRUCache::Insert(const Slice& key, void* value, size_t charge, void (\*deleter)(const Slice& key, void* value))ShardedLRUCache::Lookup(const Slice& key)ShardedLRUCach…...
GDOI2024游记
Day0 中午一点钟从学校出发去东莞,大概坐了一个多小时车,两点半多到酒店。住的八方精选酒店(ljh说他们住九方精选酒店,乐),说的是景区酒店,但打开外窗,近处是简陋的阳台,…...
学编程怎么样才能更快入手,编程怎么简单易学
学编程怎么样才能更快入手,编程怎么简单易学 一、前言 对于初学编程建议先从简单入手,然后再学习其他复杂的编程语言。 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 …...
Android 通知--判断通知是否有跳转
一. 从应用层来分析 在 Android 中,可以通过 PendingIntent 来实现有跳转的通知和没有跳转的通知的区别。具体来说,有跳转的通知会设置一个 PendingIntent,当用户点击通知时会触发该 PendingIntent,打开指定的界面或执行特…...
【计算机网络】IO多路转接之poll
文章目录 一、poll函数接口二、socket就绪条件三、poll的优点四、poll的缺点五、poll使用案例--只读取数据的server服务器1.err.hpp2.log.hpp3.sock.hpp4.pollServer.hpp5.main.cc 一、poll函数接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int t…...
性能比较:in和exists
当在Hive SQL中使用NOT IN和NOT EXISTS时,性能差异主要取决于底层数据的组织方式、数据量大小、索引的使用情况以及具体查询的复杂程度。下面是对这两种方法的性能分析: 1. NOT IN:- 工作原理:NOT IN子查询会逐个比较主查询中的值…...
【Java设计模式】五、建造者模式
文章目录 1、建造者模式2、案例:共享单车的创建3、其他用途 1、建造者模式 某个对象的构建复杂将复杂的对象的创建 和 属性赋值所分离,使得同样的构建过程可以创建不同的表示建造的过程和细节调用者不需要知道,只需要通过构建者去进行操作 …...
nginx代理minio教程 避坑过的教程 避开SignatureDoesNotMatch
本次教程使用的是单机minio进行演示,集群minio也和这个差不多。 按照这个教程,可以避开nginx代理minio之后,只能访问文件,但是通过预签名url上传文件就会报SignatureDoesNotMatch的坑 暂定如下: 你已经下载好miniom…...
Linux进程详细介绍
文章目录 Linux进程1、计算机体系结构和操作系统管理1.1、计算机体系结构 -- 硬件1.2、操作系统(Operator System) -- 软件 2、进程2.1、进程基本概念2.2、进程标识符2.2.1、获取当前进程标识符和当前进程的父进程标识符2.2.2、通过系统调用创建进程 -- …...
2024年3月产品认证基础考试简答题及答案
产品认证基础 46.产品认证的工厂检查有哪几种路线?各有什么优缺点? 答案:两种常用的检查路线: 1.按照要素或过程检查 按照认证规则规定的工厂应满足的要素要求(包括质量保证能力要求),结合部…...
嵌入式蓝桥杯做题总结
第十二届省赛 按键代码 ——自认为比较巧妙,定时器3被设置为10ms进入一次中断,代替了HAL_Delay(10)的方法消抖; 运用状态机机思想实现检测多个按键检测——且分为两个状态,其中一个状态PB1和PB2的按键不…...
Spring Boot 常用注解大全
以下是Spring Boot中常用的注解及其详细解释以及相应的代码示例: SpringBootApplication: 这个注解用于标识一个Spring Boot应用的主类。它整合了 Configuration,EnableAutoConfiguration 和 ComponentScan。 SpringBootApplication public class Demo…...
(MATLAB)第十二章-数列与极限
目录 12.1 数列 12.1.1 数列求和 1. 累计求和函数sum() 2. 忽略NaN累计求和函数 nansum() 3. 求此元素位置之前的元素和函数cumsum() 4. 求梯形累计和函数cumtrapz() 12.1.2 数列求积 1. 元素连续相乘函数 prod() 2. 求累计积函数 cumprod() 3. 阶乘函数 ffactorial(n…...
OJ输入问题+准备
写在之前: 发现题目输入是这样的: 我的问题:如何通过空格分割这些输入的字符串并分别保存!!(C语言scanf好解决一点但我选择C....) C引入了ostringstream、istringstream、stringstream这三个类…...
软考高级:主动攻击和被动攻击概念和例题
作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…...
cuda python torch 虚拟环境配置
以下是Pytorch和CUDA对应的版本 以下是Pytorch和Python对应的版本 检查cuda与Python版本是否匹配 import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.empty(3,4,devicecuda))cuda 删除cuda conda uninstall cudatoolkit --forceconda u…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...
智警杯备赛--excel模块
数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...
