创建索引时并不一定会锁表,这取决于具体的数据库系统、数据库版本以及创建索引的方式。
一、MySQL数据库
MySQL 5.6及以前版本:
这意味着在创建索引的过程中,其他会话(session)对表的写操作(如INSERT、UPDATE、DELETE)会被阻塞,但读操作(SELECT)通常不会受到影响。
在这些版本中,创建索引时通常会锁表。
MySQL 5.6.7及以后版本:
这一技术允许在创建索引时,不阻塞其他会话的DML操作(INSERT、UPDATE、DELETE、SELECT)。
因此,在这些版本中,创建索引通常不会锁表。
如果存在活动中的事务(如慢查询或死锁等情况),DDL操作可能需要等待,这可能会影响业务数据的运行。
然而,值得注意的是,Online DDL操作完成之前,必须等待在表上持有元数据锁(Metadata Lock)的事务提交或回滚。
从MySQL 5.6.7版本开始,引入了Online DDL(在线DDL)技术。
创建索引的方式:
如果使用
ALTER TABLE
语句添加索引,在某些情况下可能会锁表,具体取决于MySQL的版本和配置。如果使用
CREATE INDEX
语句添加索引,并且数据库版本支持Online DDL,则通常不会锁表。