我们起首竖立一个新的数据表:
这里我们的主键默许是有索引的;这边加几条数据
然后我们开两个历程举行测试:
先加一个where前提没有涉及到索引的锁:
然后我们在第二个窗口举行一个更新这一行的数据,我们会发明这个操纵会被卡着,
然后我们提交事件会发明第二个窗口的数据会立马实行,
从上面来看好像没有任何题目,如许确切达到了我们想要的目标,然则你能够再加一样的锁,试着更新下其他的数据比方我下面实行的数据:
上面的三种状况都是我用一样的流程测试的,他们都会被卡住,如许题目就来了,我们实在在锁住name='测试姓名'的时刻也许只是想锁住id=133和id=134两行,我们并不想锁住135,136,137,然则这三行我们也接见不了,由于我们的锁是一个表锁,我们来试一下另一种用锁时用到索引的状况:
上面用锁时用到了索引,然则我们在更新数据时照样被卡住了;这里我们就会以为索引实在也没什么用,然则你碰到一样的锁,更新数据时也用到索引是能够看一下结果:
我们会发明这个没有被锁卡住,直接更新了;
下面总结一下:如果我们的锁用到索引就是行锁,如果没有用到索引就是表锁,然则我们操纵的数据必需用到锁才行;
下面我们来讲一下为何会如许:
起首我们晓得如果没有竖立索引的话我们在举行数据拔取或许定位的时刻是经由过程全表扫描的情势来举行的,如许就会构成表锁,如果有索引的话就会直接定位到指定的行,就是构成行锁,然则要注意你在更新数据是如果没用到索引也会全表扫描,当扫到被锁的这一行是也会被锁住,所以达不到想要的结果;
相干引荐:
mysql的锁机制_MySQL
MySQL锁的用法之表级锁
怎样完成MySQL锁的优化
以上就是mysql锁和索引之间的联络的细致内容,更多请关注ki4网别的相干文章!