我刚遇到一个查询,遇到了一个死锁,它试图获取的锁是用于索引的。但是,当我使用explain可视化查询时,我发现key和possible_key下面列出了一个不同的索引。回到查询时,我发现导致死锁的键只在order子句中使用的列上,而在查询中没有使用其他地方。
这让我思考:给定一个任意的SQL语句,如何找到mysql需要获得一个锁才能运行的所有索引?
发布于 2016-03-20 18:55:57
你是从错误的方向来的。任何查询都可以随时死锁。因此,当死锁发生时,您必须准备重播整个事务。
当然,尽量避免死锁是个好主意,有几件事情可以降低死锁的频率。主要技术是使查询速度更快。
在前面提到的情况下,优化器可能会认为避免ORDER BY的“排序”比使用任何其他索引更好,甚至不使用索引。让我们看看SHOW CREATE TABLE和EXPLAIN SELECT来进一步剖析所发生的事情。
另一种技术是包含最优索引--通常是多列上的“复合”索引。有时,有一个“覆盖”索引(包括查询中提到的所有列)甚至是好的。
在使用IN时,另一种技术是对值进行排序。
https://dba.stackexchange.com/questions/132562
复制相似问题