我目前正在优化一个应用程序,在那里我们得到了大量的锁等待超时。在使用
> show engine innodb status
我们看到undex最新检测到的死锁列,update语句持有大量锁。这些锁被保留是因为这些语句使用的索引列在我们的应用程序中不是唯一的。如果update/delete语句可以使用所需的索引来防止锁等待超时,这将非常有帮助。
我们使用的是MySQL5.7版本,表使用的是innodb引擎。有一种方法可以强制select语句使用特定的索引,但根据mysql文档,在update/delete时没有明确的方法。
索引提示仅适用于select语句(语法分析器接受它们作为update语句,但是忽略它们并且没有任何效果。)
为了在我们的更新中强制使用索引,我们提出的一种方法是让优化器通过对这些列使用函数来丢弃我们不需要的索引。下面是一个没有任何更改的示例查询:
update requests_table set is_active='t' where request_id='1' and is_active='f' ;
我们需要的是对请求id进行索引搜索,但optimizer使用的是在应用程序运行时处于活动状态的
使用explain on plain query会将request\u id作为所选索引,但当应用程序运行时,优化器会选择is\u active列。
在where子句中使用函数后,形成的查询是:
update requests_table set is_active='t' where request_id='1' and concat(is_active,'')='f' ;
explain查询将request\u id显示为唯一可能使用的键。这个代码将在明天直播,所以我会得到确切的统计数字。
我想知道这是否是强制在update/delete语句上使用索引的正确方法。
附言:这个问题是安静的细节,因为这是一个非常关键的问题,我们不想错过任何细节。对所犯的错误表示歉意。
暂无答案!
目前还没有任何答案,快来回答吧!