mysql 5.6 创建索引导致表锁阻塞查询

     今天遇到一个表锁,对表进行select操作阻塞,最后发现在表操作时的时候执行了创建索引,导致整个表锁了

测试如下:

             1.先执行一个慢查询

              mysql> select sleep(500) from order_log;

              2.对表进行创建索引操作

             ALTER TABLE `order_log` 
            ADD KEY `idx_orderlog_name`(orderno,operate_time) USING BTREE   或者

                create index idx_ordergood_com on `order_log` (orderno,operate_time)

              3.然后在对表进行简单的查询操作发现查询阻塞

               mysql> select * from order_log limit 1;
+----------+-------------------+---------------+--------------+-----------------
-+---------------------+-----------------------------------------+------------+-
-------------+--------------------------------------------------+-------------+
| Id       | orderno           | customer_code | operate_type | operater_jobuuid
 | operate_time        | about_info                              | about_code |
synch_status | httpcol                                          | httpcol_CRC |
+----------+-------------------+---------------+--------------+-----------------
-+---------------------+-----------------------------------------+------------+-
-------------+--------------------------------------------------+-------------+
| 12772266 | PD145136518839426 | ZUE           | 2            | ADMIN
 | 2015-12-29 13:32:55 | 管理员创建作业任务(TZUE155584)          | NULL       |
NULL         | https://www.baidu.com/12772266/PD145136518839426 |  3244637683 |
+----------+-------------------+---------------+--------------+-----------------
-+---------------------+-----------------------------------------+------------+-
-------------+--------------------------------------------------+-------------+
1 row in set (9 min 37.30 sec)    --查询9分钟多
mysql>

索引也创建了10分钟,正常情况下30s就建好了

[SQL]create index idx_ordergood_com on `order_log` (orderno,operate_time)
受影响的行: 0
时间: 607.388s

只有慢查询结束了之后,才能创建索引和其他的操作


  mysql 5.6支持在线ddl操作,在对表进行alter table 时,对该表的增,删,改,查均不会锁表。

但如果在该表被访问时,执行DDL操作会导致表锁,会阻塞对表的任何操作,所以在进行上线操作时一定要观察一下是否有对表操作的慢的查询语句或者事物


   




<think>好的,用户想在TDSQL中调整的列顺序。首先,我需要回忆一下MySQL的相关知识,因为TDSQL是基于MySQL的。根据引用[3],用户通过改变SELECT语句中的列顺序可以改变输出顺序,但这只是查询时的显示效果,并不实际改变的存储结构。用户可能希望实际调整中列的物理顺序,这需要ALTER TABLE语句。 不过,根据MySQL的文档,直接修改列顺序的ALTER TABLE操作可能会比较复杂。例如,使用ALTER TABLE ... MODIFY COLUMN或ALTER TABLE ... CHANGE COLUMN时,可以通过AFTER子句来调整列的位置。比如,ALTER TABLE tbl_name MODIFY col_name3 VARCHAR(20) AFTER col_name1; 这样可以将col_name3移动到col_name1之后。但需要注意的是,频繁的结构修改,尤其是涉及数据重排的操作,可能会导致性能问题,如引用[4]提到的索引碎片和页面分裂问题。 接下来要考虑TDSQL的特殊性,作为分布式数据库,结构变更可能会涉及多个节点和数据分片。需要确认TDSQL是否支持这样的ALTER TABLE操作,以及是否有额外的限制。根据引用[1]和引用[2],TDSQL强调遵循合理的数据库设计规范,比如使用主键,避免无主键带来的数据不一致风险。因此,在调整列顺序前,确保有主键可能是个好建议,以避免潜在问题。 另外,用户可能需要了解,即使调整了列顺序,底层存储可能并不会严格按照新的顺序存储,特别是对于已经存在的数据。这时候可能需要使用OPTIMIZE TABLE来优化结构,但这又会带来额外的开销。 还需要考虑是否有其他方法,比如创建并复制数据,然后重命名。这种方法虽然步骤更多,但在某些情况下可能更安全,尤其是在分布式环境中。同时,需要注意在迁移数据时使用事务来保证一致性,避免数据丢失或不一致。 最后,需要提醒用户在执行结构变更前进行备份,尤其是在生产环境中。同时,检查TDSQL的官方文档或联系技术支持,确认具体的操作步骤和注意事项,确保操作不会影响现有的数据分布和同步机制。</think>在TDSQL(基于MySQL内核的分布式数据库)中调整结构的列顺序,需要理解其与MySQL操作的一致性及分布式场景下的特殊注意事项。以下是具体实现方法和相关风险说明: --- ### 一、MySQL原生列顺序调整方法 通过`ALTER TABLE`语句实现列顺序调整,支持两种语法: ```sql -- 方法1:将列移动到首列 ALTER TABLE 名 MODIFY 列名 列类型 FIRST; -- 方法2:将列移动到指定列之后 ALTER TABLE 名 MODIFY 列名 列类型 AFTER 目标列名; ``` **示例**: 将`col3`移动到`col1`之后: ```sql ALTER TABLE users MODIFY col3 VARCHAR(50) AFTER col1; ``` --- ### 二、TDSQL分布式场景注意事项 1. **主键约束要求** TDSQL要求所有分片必须包含主键[^4],无主键可能引发数据不一致风险(如物理位置`ctid`导致的异常)[^1]。执行列顺序调整前需确认已定义主键。 2. **数据重组开销** 修改列顺序会导致重建,对于大可能产生以下影响: - 数据页重新排列引发I/O压力[^4] - 分布式环境下需同步所有分片的结构变更 - 建议在业务低峰期操作 3. **替代方案** 若频繁修改列顺序,可考虑通过视图实现逻辑顺序调整: ```sql CREATE VIEW reordered_view AS SELECT col3, col1, col2 FROM origin_table; ``` --- ### 三、操作步骤演示 1. **检查结构** ```sql SHOW CREATE TABLE users; ``` 2. **执行列顺序调整** ```sql -- 将birthday列移动到name列之后 ALTER TABLE users MODIFY birthday DATE AFTER name; ``` 3. **验证结果** ```sql DESC users; ``` --- ### 四、相关风险与优化建议 | 风险类型 | 具体现 | 规避措施 | |---------|---------|---------| | 阻塞 | DDL操作导致 | 使用`ALGORITHM=INPLACE`(需MySQL 5.6+支持) | | 空间膨胀 | 临时重建消耗存储 | 预留20%磁盘空间 | | 同步延迟 | 分布式节点间结构同步延迟 | 监控`SHOW PROCESSLIST`状态 | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值