前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL 毛病那么多,optimize table 为什么做不了

MYSQL 毛病那么多,optimize table 为什么做不了

作者头像
AustinDatabases
发布2024-04-18 13:09:23
1000
发布2024-04-18 13:09:23
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

MySQL 在数据增长中,会遇到一个问题数据在清理后,无法将数据表空间回收,大多数的人员在处理这个问题的时候,可以通过optimize table 的方案来解决.

代码语言:javascript
复制
 CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `empid` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
代码语言:javascript
复制
 optimize table test.test;
+-----------+----------+----------+-------------------------------------------------------------------+
| Table     | Op       | Msg_type | Msg_text                                                          |
+-----------+----------+----------+-------------------------------------------------------------------+
| test.test | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.test | optimize | status   | OK                                                                |
+-----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.03 sec)

但在某些情况下,optimize table 的操作会遇到失败的情况,而引起这个问题的主要原因是,数据表中有唯一索引,而具备唯一索引的表,正在出入重复的数据时,导致的optimize table 的执行错误。

通过存储过程我们插入数据,在此同时我们写另一个存储过程不断的往test表中插入重复的数据,持续的插入,然后我们在另一个连接中,持续的运行optimize table。

代码语言:javascript
复制
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+----------+----------+-------------------------------------------------------------------+
| Table     | Op       | Msg_type | Msg_text                                                          |
+-----------+----------+----------+-------------------------------------------------------------------+
| test.test | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.test | optimize | error    | Duplicate entry '100' for key 'test.name'                         |
| test.test | optimize | status   | Operation failed                                                  |
+-----------+----------+----------+-------------------------------------------------------------------+


代码语言:javascript
复制

mysql> delimiter //
mysql> CREATE PROCEDURE dotest()
    -> BEGIN
    -> DECLARE i INT DEFAULT 1;
    -> WHILE (i <= 2000000) DO
    -> INSERT INTO `test` (id, name, empid) values (i, i, i);
    -> SET i = i+1;
    -> END WHILE;
    -> END
    -> //
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;
mysql> call dotest();


上图中可以看到在optimize table 的时候,有报错信息,其中在操作失败前面,会提示Duplicate entry 操作,然后operation failed。

简单解释是因为,在optimize table 操作时会对唯一索引进行重新的整理,并且重新生成索引会对数据进行检查,当插入重复数据的时候,无法满足唯一约束条件,而导致OT操作失败。

运行DDL操作时,运行ALTER TABLE或optimize table语句的线程会应用来自其他连接线程并发运行在相同表上的DML操作的在线日志。当应用DML操作时,可能会遇到重复键条目错误(ERROR 1062 (23000):Duplicate entry),即使重复条目只是临时的,并且稍后会被在线日志中的另一个条目回滚。这类似于InnoDB中的外键约束检查的概念,约束必须在事务期间保持。

同样更换了 alter table engine=innodb; 产生的结果是一致的,都是无法进行。

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

本文分享自 AustinDatabases 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档