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

本文探讨了在MySQL中执行创建索引操作时如何导致表级锁,进而引起查询阻塞的问题。通过实验演示了在慢查询执行期间创建索引会如何影响表的可用性,并讨论了MySQL 5.6版本中对于在线DDL操作的支持情况。

     今天遇到一个表锁,对表进行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>嗯,用户想知道在MySQL中使用ALTER和CREATE语句创建索引的区别。首先我需要回忆一下MySQL创建索引的几种方法。记得主要有两种方式,一种是使用CREATE INDEX语句,另一种是使用ALTER TABLE语句。不过可能还有其他方式,比如在创建的时候直接定义索引。 然后,我应该先分别解释这两种语句的基本用法。比如,CREATE INDEX的语法应该是CREATE INDEX index_name ON table_name (column_name); 而ALTER TABLE则是ALTER TABLE table_name ADD INDEX index_name (column_name);。可能需要确认一下语法是否正确,有没有记错的地方。 接下来,需要比较它们的区别。首先,功能上的差异,ALTER TABLE是不是只能添加索引,而CREATE INDEX是专门用来创建索引的。然后,是否支持某些类型的索引,比如全文索引或者空间索引,这两种语句是否都支持?我记得CREATE INDEX可能不支持某些索引类型,必须用ALTER TABLE? 另外,使用场景方面,如果要在创建之后添加索引,通常用哪个更方便?可能ALTER TABLE更适合在修改结构的时候使用,而CREATE INDEX更直接。不过用户可能更关心实际使用中的选择依据,比如性能有没有差异,或者语法上的不同。 还需要考虑权限的问题。两种语句需要的权限是否相同?比如,ALTER TABLE可能需要ALTER权限,而CREATE INDEX可能需要INDEX权限。这可能影响到用户选择使用哪种方式。 另外,在在线操作方面,特别是对于InnoDB,是否两种方式都支持在线创建索引而不?可能需要查证一下,MySQL的版本不同可能有不同现。例如,在MySQL 5.6及以上,ALTER TABLE添加索引支持在线DDL,而CREATE INDEX是否也支持同样的特性? 还有,是否有其他隐藏的差异,比如在复制环境中的现,或者对事务的影响?比如,使用ALTER TABLE会不会导致,而CREATE INDEX在某种情况下更高效? 还要记得用户提供的引用中,引用[2]提到如果没有主键,InnoDB会使用第一个唯一非空索引作为聚集索引。这可能和创建索引的方式无关,但可能需要提醒用户在创建索引时考虑索引类型对存储引擎的影响。 另外,用户提到的引用[4]中关于variables_info,可能和性能模式有关,但暂时和索引创建关系不大,可能不需要涉及。 最后,需要总结两种方法的优缺点,帮助用户根据具体情况选择合适的方式。比如,如果只需要添加索引CREATE INDEX可能更简洁;如果需要同时修改其他结构,ALTER TABLE可能更方便。 可能还要检查是否存在语法上的细微差别,比如是否可以使用相同的索引选项,比如索引类型、长度、排序方式等,两种语句是否都支持这些选项。 最后,生成相关问题的时候,可以考虑索引优化、性能影响、如何选择索引类型等问题。</think>在MySQL中,使用`ALTER TABLE`和`CREATE INDEX`创建索引的区别主要体现在语法结构、功能范围和适用场景上。以下是详细对比: --- ### 一、语法对比 1. **`ALTER TABLE`方式** 通过修改结构添加索引: ```sql ALTER TABLE table_name ADD INDEX index_name (column_list), ADD UNIQUE index_name (column_list), ADD PRIMARY KEY (column_list); ``` 支持同时添加多个索引或修改其他结构(如修改列属性)[^2]。 2. **`CREATE INDEX`方式** 直接创建独立索引: ```sql CREATE INDEX index_name ON table_name (column_list); CREATE UNIQUE INDEX index_name ON table_name (column_list); ``` 仅用于创建普通索引或唯一索引,**不能创建主键**[^2]。 --- ### 二、核心差异 | 特性 | `ALTER TABLE` | `CREATE INDEX` | |---------------------|-----------------------------------|----------------------------------| | **主键支持** | 支持`ADD PRIMARY KEY` | 不支持 | | **多操作合并** | 可同时添加索引、修改列等 | 仅创建索引 | | **索引类型** | 支持所有索引(普通/唯一/主键) | 仅支持普通索引和唯一索引 | | **权限要求** | 需要`ALTER`权限 | 需要`INDEX`权限 | --- ### 三、使用场景建议 1. **优先用`ALTER TABLE`** - 需要创建主键或与其他修改操作(如添加列)合并时 - 需要显式指定索引类型(如`USING BTREE`) 2. **优先用`CREATE INDEX`** - 仅需快速添加普通/唯一索引时 - 语法更简洁直观 --- ### 四、性能与底层实现 1. **在线DDL支持** 两种方式在MySQL 5.6+均支持`ALGORITHM=INPLACE`在线创建索引(不阻塞读写)[^4]。 2. **主键的特殊性** 若无主键,InnoDB会自动选择第一个唯一非空索引作为聚集索引[^2],因此主键创建推荐使用`ALTER TABLE`。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值