我们有一个包含200多万条记录的表。这些记录通过两个源插入,分别来自UI和AWS lambda/step函数。问题是,当通过lambda插入/更新记录时,DB错误显示为“General error: 1205 Lock wait timeout exceeded; try restarting transaction
“。表中未添加索引。以下是导致该问题的输出解释语句。
以下更新查询导致问题。
UPDATE xxx SET
is_primary = 0,
updated_at = '2022-11-23 09:36:11'
WHERE x.id = 1684585 AND
xxx.id is not null AND
is_primary = 1 AMD
xxx.deleted_at IS NULL;
您可以看到查询扫描了1246661条记录。
1.在xxx_id上添加索引是否会加快更新查询?
1.在具有200多万条记录的表上添加索引是否安全?
1.这会有任何广告效果,我的意思是这会减缓更新而不是加快吗?
编辑:我已重命名表名和ID字段名
1条答案
按热度按时间b4lqfgs41#
如果要快速更新一行,并且该行中有一列是唯一键或主键,则可以在WHERE子句中使用该键。如果'id'不是唯一键,那么您需要检查数据和应用程序逻辑,以查看是否可以安全地为它创建唯一索引。这实际上取决于您提供的信息以外的更多信息。如果不适合使用唯一键,则使用非唯一键可能会有帮助,但这样可能会一次更新多行,而这可能不是您所希望的。仅仅添加索引以希望提高性能通常不是一个好主意。数据库设计并不简单。
一般来说,添加索引会提高使用索引的查询的速度,但通常只会稍微降低不使用索引的查询的速度。向大型表添加索引可能需要一些时间,因此请注意,在创建索引时可能会影响数据库的性能。如果可以在数据库处于空闲状态时执行此操作,则会更好。