在平时我们用mysql的锁时,一般刚接触数据库是很少考虑锁的效率,一般只求到达防止并发的目的就可以了,但是随着数据量的增大我们就会发现有很多sql我们已经写的非常优化了,但是有时候还是很慢,很难找到原因,这时候我们就应该考虑一下是不是mysql的锁在导致的。

我们首先建立一个新的数据表:

mysql锁和索引之间的联系-LMLPHP

这里我们的主键默认是有索引的;这边加几条数据

mysql锁和索引之间的联系-LMLPHP

然后我们开两个进程进行测试:

mysql锁和索引之间的联系-LMLPHP

先加一个where条件没有涉及到索引的锁:

mysql锁和索引之间的联系-LMLPHP

然后我们在第二个窗口进行一个更新这一行的数据,我们会发现这个操作会被卡着,

mysql锁和索引之间的联系-LMLPHP

mysql锁和索引之间的联系-LMLPHP

然后我们提交事务会发现第二个窗口的数据会立马执行,

从上面来看似乎没有任何问题,这样确实达到了我们想要的目的,但是你可以再加同样的锁,试着更新下其他的数据比如我下面执行的数据:mysql锁和索引之间的联系-LMLPHP

上面的三种情况都是我用同样的流程测试的,他们都会被卡住,这样问题就来了,我们其实在锁住name='测试姓名'的时候或许只是想锁住id=133和id=134两行,我们并不想锁住135,136,137,但是这三行我们也访问不了,因为我们的锁是一个表锁,我们来试一下另一种用锁时用到索引的情况:

mysql锁和索引之间的联系-LMLPHP

上面用锁时用到了索引,但是我们在更新数据时还是被卡住了;这里我们就会觉得索引其实也没什么用,但是你遇到同样的锁,更新数据时也用到索引是可以看一下效果:

mysql锁和索引之间的联系-LMLPHP

我们会发现这个没有被锁卡住,直接更新了;

下面总结一下:如果我们的锁用到索引就是行锁,如果没有用到索引就是表锁,但是我们操作的数据必须用到锁才行;

下面我们来说一下为什么会这样:

首先我们知道如果没有建立索引的话我们在进行数据选取或者定位的时候是通过全表扫描的形式来进行的,这样就会形成表锁,要是有索引的话就会直接定位到指定的行,就是形成行锁,但是要注意你在更新数据是假如没用到索引也会全表扫描,当扫到被锁的这一行是也会被锁住,所以达不到想要的效果;

相关推荐:

mysql的锁机制_MySQL

MySQL锁的用法之表级锁

如何实现MySQL锁的优化

以上就是mysql锁和索引之间的联系的详细内容,更多请关注Work网其它相关文章!

09-18 19:18