我当前正在优化一个应用程序,在该应用程序中,我们会遇到很多锁定等待超时的情况。使用
分析日志后> show engine innodb status
我们看到undex LATEST DETECTED DEADLOCK列显示更新语句持有很多锁。之所以持有这些锁,是因为根据我们的应用程序,这些语句使用的索引列不是唯一的。如果update / delete语句可以使用所需的索引,这将有很大帮助,这将防止锁等待超时。
我们正在使用Mysql 5.7版本,表正在使用Innodb引擎。有一种方法可以强制select语句使用特定的索引,但没有根据mysql文档在更新/删除时使用显式方法的方法。
索引提示仅适用于SELECT语句。 (他们被 UPDATE语句的解析器,但被忽略并且无效。)
要在我们的更新上强制使用索引,我们想出的一种方法是使优化器通过对那些列使用函数来丢弃不需要的索引。这是下面没有任何更改的示例查询:
update requests_table set is_active='t' where request_id='1' and is_active='f' ;
我们想要的是在request_id上进行索引搜索,但是应用程序运行时优化器正在使用is_active。(PS:两列都已建立索引,request_id是此处的主键)
使用简单查询上的解释将request_id作为所选索引,但是当应用程序运行时,优化器选择is_active列。
在where子句中使用函数后,形成的查询为:
update requests_table set is_active='t' where request_id='1' and concat(is_active,'')='f' ;
解释查询显示request_id是唯一可以使用的键。该代码明天将发布,这样我将获得确切的统计信息。
我想知道这是否是强制使用索引的正确方法 更新/删除语句。
PS:问题很详细,因为这对我们来说是一个非常关键的问题,我不想错过任何细节。对于任何错误,我们深表歉意。