mysql update where 条件不是索引的话,是行锁还是表锁?

网上某些资料提及,未加锁索引即加表锁的说法不正确。InnoDB源码中在扫描记录时,针对索引项加锁,全表扫描意味着索引项全部被锁,相当于锁定了整张表。避免此类情况,可将MySQL里的`sql_safe_updates`参数设置为1,启用安全更新模式。官方解释为,当设置为1时,MySQL会中止未使用键在WHERE子句或未使用...
mysql update where 条件不是索引的话,是行锁还是表锁?
在MySQL中,基于InnoDB存储引擎,使用UPDATE操作时,如果WHERE条件中的列并非索引列,系统将采用表锁而非行锁。表锁覆盖整个表,而行锁仅锁定特定行。无索引时,MySQL将进行全表扫描,这导致锁定整个表,而非涉及的单一行。

举例来说,假设我们有表名为`users`,包含`id`(主键)和`name`两个列。执行以下UPDATE语句,如果`name`列未设索引,MySQL会使用表锁,全表扫描以匹配`name = 'Old Name'`的行。

为解决此问题,可为经常作为查询条件的列创建索引。这样能减少使用表锁的机会,提升并发性能。例如,为`name`列创建索引。

更新执行后,因索引存在,仅锁定匹配条件的行,而非整个表。

网上某些资料提及,未加锁索引即加表锁的说法不正确。InnoDB源码中在扫描记录时,针对索引项加锁,全表扫描意味着索引项全部被锁,相当于锁定了整张表。

避免此类情况,可将MySQL里的`sql_safe_updates`参数设置为1,启用安全更新模式。官方解释为,当设置为1时,MySQL会中止未使用键在WHERE子句或未使用LIMIT子句的UPDATE或DELETE语句。此设置有助于捕获未正确使用键的UPDATE或DELETE语句,可能大量改变或删除行。

总结,执行UPDATE语句时,务必确保WHERE条件包含索引列,并在测试环境中确认语句是否采用索引扫描。打开MySQL的`sql_safe_updates`参数可预防UPDATE操作时WHERE条件未带索引列的情况。若发现即使在WHERE条件中包含索引列,优化器选择全表扫描,应使用`force index([index_name])`告知优化器使用特定索引,规避锁表隐患。2024-09-24
mengvlog 阅读 7 次 更新于 2025-07-20 06:24:40 我来答关注问题0
檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部