Mysql的问题及浅探索:update语句未使用索引的更新慢的问题
前提条件
一、表数据总量有一百多万条数据,表结构如下:
id | name | code | integral | create_time |
---|---|---|---|---|
主键 | 名称 | 代号 | 积分 | 时间 |
二、更新语句如下,其中只有name,code作为条件语句
UPDATE table1
SET name='张三',code='zhangsan',integral=600,create_time='2022-10-21 09:22:29.098'
WHERE name='张三' AND code='zhangsan'
三、更新慢的问题
在有5000条以上的更新语句操作时,会出现服务器的cpu升高
问题原因的猜想
一、无索引的问题
1、由于没有索引,update语句执行前会进行全表扫描搜索匹配,并且在找到相应的满足where条件的所有行进行行级锁的锁定
(例如 UPDATE、DELETE、INSERT会自动获取排他锁(Exclusive Lock))
2、在默认情况下,当 MySQL 进行全表扫描时,会应用一种称为"隐式锁定"(Implicit Locking)的机制,其中包括对扫描的行进行锁定,以防止其他事务对这些行进行并发修改。
在全表扫描的情况下,MySQL 会使用共享锁(Shared Lock),允许多个事务同时读取同一行数据,但阻止其他事务获取排他锁(Exclusive Lock),从而防止其他事务对这些行进行写操作。
隐式锁定的目的是确保在事务中的全表扫描期间,其他事务不会对被扫描的行进行写操作,以保持事务的隔离性和一致性。
随着 MySQL 版本的演进,数据库引擎可能会对隐式锁定的实现进行一些优化,以提高性能和并发性。然而,在默认情况下,全表扫描通常会导致行级锁的获取。
所以需要注意的是,全表扫描可能会对性能产生负面影响,尤其是在大表上。在执行大量全表扫描的查询或更新操作之前,请仔细考虑并测试性能,以确保数据库的正常运行。添加适当的索引是优化性能的一种方法,因为它可以将全表扫描转换为更高效的索引扫描