mysql 启用myisam_mysql数据库使用MyISAM引擎老是卡死?MyISAM锁的介绍和实践

现在会写代码的,应该没人会不知道mysql吧?因为mysql数据库是免费的,被大量的运用于各种项目,那么自然性能就是大家最关注的,随着业务的增长,数据库的数量的不断增加,老是发现各种不愉快的事情,比如某某说查询个数据老半天出不来,某某又说,我怎么写不进数据库了?那么,今天就让小超越工作室带大家了解一下mysql数据库使用MyISAM引擎的锁机制吧,剖析一下导致mysql数据表卡死的问题。

aa5fc25e5d2712fd009ab338d9b11172.png

MyISAM引擎下如何设置表锁

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,我们不需要手动去做任何的操作!

MyISAM在执行更新操作 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,,我们不需要手动去做任何的操作,因此,只要给表设置myisam引擎,就可以了。

阻塞发生的场景

对MyISAM表读操作时候,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求

对MyISAM表写操作,则会阻塞其他用户对该表的读写操作,当一个线程获得对一个表的写锁后可以对表进行更新操作,其他线程的读、写操作都会等待,直到锁被释放为止

接下来通过实践来观察下,对MyISAM表读操作时候,会如上面我们说的那样其他用户对该表的读请求不会阻塞,写请求会阻塞吗?

(先建立一张test表,存储引擎为myisam,字段为id,name,并插入几条数据)

(1)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行select,观察:

ad5574527c94406fa4eeeabb13d11ab4.png

在A窗口查询没有结束之前,B窗口对该表进行查询,查询结果立刻出现,无需等待A窗口的查询结束

注:sleep(4)是每条数据暂停4秒的意思,如果select的结果数据有1条就会暂停4秒,有3条就会暂停12秒

(2)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行update,观察:

4fbba12f0985a5efc0c0ae852c496d6d.jpg

在查询没有结束之前,update更新操作是处于一直等待状态,查询结束之后,update操作才开始执行

(3)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行delete,观察:

011efd3488bc74bd3a3db3a712e47595.jpg

在查询没有结束之前,delete删除操作是处于一直等待状态,查询结束之后,delete操作才开始执行

(4)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行insert,观察:

289e56c78d45554b95ad29b0eb457d79.png

在查询没有结束之前,insert操作是处于一直等待状态,查询结束之后,insert操作才开始执行

经过上面的4个测试,我们可以看到myisam表在执行查询操作的时候,其他进程对该表的读操作没有影响,但是写操作(增删改查)会发生阻塞,直到第一个获得读锁的进程操作完成释放完读锁后,写操作才能进行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值