首页 > 数据库 >处理MySQL高水位表的相关测试

处理MySQL高水位表的相关测试

时间:2023-09-09 11:32:42浏览次数:46  
标签:-- demo MySQL 水位 sec 测试 mysql table NULL

文档课题:处理MySQL高水位表的相关测试.
数据库:MySQL 5.7.21
系统:rhel 7.3
1、理论知识
MySQL中使用delete删除数据后并不会回收存储空间,而是等待新数据填补该空洞,若无数据填补,则此部分存储空间会造成资源浪费。此时需使用optimize table释放空间。对于写操作频繁的表,需根据实际情况定期进行optimize。optimize table是由各存储引擎来实现,因此并不是所有存储引擎都可以应用,目前只有MyISAM、BDB和InnoDB可以实现该功能,且optimize table在运行过程中,MySQL会锁表。

语法如下:
optimize [local | no_write_to_binlog] table tb_name [,tbl_name] ……
常用语句:
optimize table tablename;

2、准备数据
2.1、建测试表
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| booksDB            |
| fruitsDB           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> use booksDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> CREATE TABLE demo_table (
    ->   `id` bigint(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    ->   `col1` varchar(10),
    ->   `col2` varchar(36),
    ->   `col3` varchar(36)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> alter table demo_table add index idx_col1(col1);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table demo_table add index idx_col23(col2,col3);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

--使用存储过程向表添加100w条数据
mysql> delimiter $
mysql> create procedure proc_initData()
    -> begin
    ->     declare i int default 1;
    ->     while i <= 1000000 do
    ->         insert into demo_table(col1,col2,col3) values (i,i div 10,i div 100);
    ->         SET i = i + 1;
    ->     end while;
    -> end $
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call proc_initData();
Query OK, 1 row affected (21 min 16.97 sec)

--更新Cardinality参数
mysql> analyze table demo_table;
+--------------------+---------+----------+----------+
| Table              | Op      | Msg_type | Msg_text |
+--------------------+---------+----------+----------+
| booksDB.demo_table | analyze | status   | OK       |
+--------------------+---------+----------+----------+
1 row in set (0.01 sec)

2.2、删除前确认数据
--查数据量
mysql> select count(*) from demo_table;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.14 sec)

--查表文件大小
[mysql@mysql-leo-master booksDB]$ ll -hrS | grep demo_table
-rw-r-----. 1 mysql mysql 8.5K Sep  9 09:54 demo_table.frm
-rw-r-----. 1 mysql mysql 148M Sep  9 10:22 demo_table.ibd

--查索引信息
mysql> show index from demo_table;
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| demo_table |          0 | PRIMARY   |            1 | id          | A         |      997144 |     NULL | NULL   |      | BTREE      |         |               |
| demo_table |          1 | idx_col1  |            1 | col1        | A         |      901931 |     NULL | NULL   | YES  | BTREE      |         |               |
| demo_table |          1 | idx_col23 |            1 | col2        | A         |      132603 |     NULL | NULL   | YES  | BTREE      |         |               |
| demo_table |          1 | idx_col23 |            2 | col3        | A         |       82456 |     NULL | NULL   | YES  | BTREE      |         |               |
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

Table:表名
Non_unique:是否唯一索引(0:是、1:否)
Key_name:索引名
Seq_in_index:索引中的列序列号,从1开始
Column_name:索引对应列
Collation:列在索引中到存储方式(A:升序 NULL:无分类)
Cardinality:索引中唯一值数目的估计值
Sub_part:如果列只是被部分编入索引,则为被编入索引的字符数目,若整列被编入索引,则为NULL
Packed:指示关键字如何被压缩,若没有被压缩,则为NULL
Null:索引列是否存在空值(YES:存在 空:不存在)
Index_type:索引存储数据结构

Cardinality可通过运行ANALYZE TABLE或myisamchk -a更新,根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。当进行联合时,基数越大MySQL使用该索引的机会就越大.

2.3、删除数据
--删一半数据
mysql> delete from demo_table where id>500000;
Query OK, 500000 rows affected (3.57 sec)

2.4、查删除后文件
[mysql@mysql-leo-master booksDB]$ ll -hrS | grep demo_table
-rw-r-----. 1 mysql mysql 8.5K Sep  9 09:54 demo_table.frm
-rw-r-----. 1 mysql mysql 148M Sep  9 10:40 demo_table.ibd

说明:如上所示ibd文件大小无变换.

--查索引信息
mysql> show index from demo_table;
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| demo_table |          0 | PRIMARY   |            1 | id          | A         |      498930 |     NULL | NULL   |      | BTREE      |         |               |
| demo_table |          1 | idx_col1  |            1 | col1        | A         |      451289 |     NULL | NULL   | YES  | BTREE      |         |               |
| demo_table |          1 | idx_col23 |            1 | col2        | A         |       66349 |     NULL | NULL   | YES  | BTREE      |         |               |
| demo_table |          1 | idx_col23 |            2 | col3        | A         |       41258 |     NULL | NULL   | YES  | BTREE      |         |               |
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

说明:对比此前数据,索引查询中Cardinality字段减少一半.
3、相关优化
3.1、使用optimize优化
--使用optimize table优化
mysql> optimize table demo_table;
+--------------------+----------+----------+-------------------------------------------------------------------+
| Table              | Op       | Msg_type | Msg_text                                                          |
+--------------------+----------+----------+-------------------------------------------------------------------+
| booksDB.demo_table | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| booksDB.demo_table | optimize | status   | OK                                                                |
+--------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (2.54 sec)

3.2、查看优化后的文件
[mysql@mysql-leo-master booksDB]$ ll -hrS | grep demo_table
-rw-r-----. 1 mysql mysql 8.5K Sep  9 10:47 demo_table.frm
-rw-r-----. 1 mysql mysql  64M Sep  9 10:47 demo_table.ibd

说明:如上所示,文件大小缩减到此前的一半.
3.3、使用engine优化
--如下测试另一种释放空间的方法,删除一半数据
mysql> delete from demo_table where id>250000;
Query OK, 250001 rows affected (1.50 sec)

--查文件大小
[mysql@mysql-leo-master booksDB]$ ll -hrS | grep demo_table
-rw-r-----. 1 mysql mysql 8.5K Sep  9 10:47 demo_table.frm
-rw-r-----. 1 mysql mysql  64M Sep  9 10:51 demo_table.ibd

--使用engine优化
mysql> alter table demo_table engine=innodb;
Query OK, 0 rows affected (1.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

--查看文件大小
[mysql@mysql-leo-master booksDB]$ ll -hrS | grep demo_table
-rw-r-----. 1 mysql mysql 8.5K Sep  9 10:56 demo_table.frm
-rw-r-----. 1 mysql mysql  36M Sep  9 10:56 demo_table.ibd

说明:如上所示,使用"alter table ……"依然可以释放delete删除数据所占用的空间.

参考网址:https://blog.csdn.net/qq_38666502/article/details/124194759

标签:--,demo,MySQL,水位,sec,测试,mysql,table,NULL
From: https://blog.51cto.com/u_12991611/7418506

相关文章

  • 15.mysql数据库安全性
    MySQL数据库的安全性是一个复杂而广泛的主题,它涉及多个方面,包括访问控制、数据保护、身份验证、审计和防止常见的数据库攻击等。以下是一些常见的MySQL数据库安全性最佳实践和示例代码,以帮助您加强MySQL数据库的安全性。请注意,这只是一个起点,实际的安全措施可能因应用程序和......
  • Python给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例【杭州多测
    ipv4地址的格式:(1~255).(0 ~255).(0 ~255).(0 ~255)1.正则表达式importredefcheck_ip(one_str):compile_ip=re.compile('^(([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$')ifcompile_ip.match(one_str......
  • mysql 开启cdc归档日志
    1、介绍mysql开启归档只需要在mysql的 my.ini 中添加几个配置即可(适用版本如下:)2、说明如下:#配置二进制日志,下面的路径logs文件夹需要提前建好log-bin=E:/mariadb-10.4.20-winx64/logs/mysql-bin.log#设置最大存储空间max-binlog-size=50000M#指定服务idser......
  • mysql实现商品分类功能
    目录概述1.0表的创建2.0主分类2.1数据添加与查询3.0子分类3.1数据添加3.2数据查询概述#1.0系统环境:windows10#2.0mysql版本:mysql8.0.2#3.0可视化软件:jetbrainsdatagrip20221.0表的创建#产品(商品)分类功能#分类表createtablecategory(idint2aut......
  • MYSQL如何搭建主从复制
    MYSQL如何搭建主从复制首先要了解为什么要用主从复制,主从复制有什么好处。首先呢,你要实现读写分离就必须要在实现主从复制的前提下,读写分离就是主服务器的数据库(master)修改、删除、增加数据,而从服务器(slave)实现读操作。MySQL读写分离是一种数据库架构设计策略,旨在分离处理数......
  • 软件测试的艺术
    @Author:BasilGuo@Date:Apr.7,2021@Description:读书笔记,软件测试的艺术@Keyword:test0.简介这本书应该是每个测试人员必备的,算是软件测试的最原始思想沉淀,在经过了40多年的软件技术发展,工具、语言的变更,这本书种所提及的测试思想却一直没有变,怪不得有人称该书为测......
  • MySQL搭建主从架构
    下载docker镜像dockerpullmysql创建两个容器dockerrun-d-p3310:3306-eMYSQL_ROOT_PASSWORD=pwd1--namemysql-01mysqldockerrun-d-p3311:3306-eMYSQL_ROOT_PASSWORD=pwd2--namemysql-02mysql连接测试可以使用阿里云的DMS或者DataGrip等客户端来连接......
  • laravel 通过事务处理两个并发请求同时更新同一条 MySQL 数据
    在处理两个并发请求同时更新同一条MySQL数据的情况时,你需要考虑并发冲突的问题,以确保数据的一致性和完整性。以下是一些解决方法:在Laravel中,你可以使用数据库事务来处理并发更新。在事务中,你可以执行一系列操作,并在操作完成后提交或回滚事务。如果两个请求同时尝试更新相同的......
  • MySQL查询命令练习(一)
    如果需要详细的命令总结在我--软件测试--个人分类里,不想翻阅的话点这个连接也可以哈《MySQL命令总结》https://blog.51cto.com/u_16239770/7383954添加记录语法格式--指定列插入数据INSERTINTO表名(列名1,列名2)VALUES(列值1,列值2);--全部列插入数据 INSERTINTO表名VALUE......
  • appium+python安装配置及代码测试完整流程
    1.appium安装及环境配置2.模拟器安装或者直接连接真机也可以3.手机各配置参数获取platformName'、'platformVersion'、appActivity、deviceName、webdriver.Remote 4.代码运行测试,启动手机应用5.进阶版,代码为POM模式......