今天遇到一个表锁,对表进行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操作会导致表锁,会阻塞对表的任何操作,所以在进行上线操作时一定要观察一下是否有对表操作的慢的查询语句或者事物