最近发现程序运行速度明显变慢,而且CPU常常在90%以上!
通过检测发现瓶颈居然在mysql,通过运行 SHOW PROCESSLIST 可以看到很多locked的查询语句,当时过了一个小时左右locked的情况又不见了。由此可见locked不是死锁。
那为什么会出现locked呢?
在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。
我的表格式为MyISAM
对WRITE,MySQL使用的表锁定方法原理如下:
◆ 如果在表上没有锁,在它上面放一个写锁。
◆否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
◆如果在表上没有写锁定,把一个读锁定放在它上面。
◆否则,把锁请求放在读锁定队列中。
当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。
这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。
如果INSERT 语句不冲突,可以自由为MyISAM 表混合并行的INSERT 和SELECT 语句而不需要锁定。
所以说MyISAM是表锁,InnoDB 是行锁
行级锁定的优点:
· 当在许多线程中访问不同的行时只存在少量锁定冲突。
· 回滚时只有少量的更改。
· 可以长时间锁定单一的行。
行级锁定的缺点:
· 比页级或表级锁定占用更多的内存。
· 当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。
· 如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表,比其它锁定明显慢很多。
· 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
在以下情况下,表锁定优先于页级或行级锁定:
· 表的大部分语句用于读取。
· 对严格的关键字进行读取和更新,你可以更新或删除可以用单一的读取的关键字来提取的一行:
• UPDATE tbl_name SET column = value WHERE unique_key_col = key_value ;
• DELETE FROM tbl_name WHERE unique_key_col = key_value ;
· SELECT 结合并行的INSERT 语句,并且只有很少的UPDATE或 DELETE 语句。
· 在整个表上有许多扫描或 GROUP BY 操作,没有任何写操作。
不同于行级或页级锁定的选项:
· 版本(例如,为并行的插入在MySQL中使用的技术),其中可以一个写操作,同时有许多读取操作。这明数据库或表支持数据依赖的不同视图,取决于访问何时开始。其它共同的术语是“时间跟踪”、“写复制”或者“按需复制”。
· 按需复制在许多情况下优先于页级或行级锁定。然而,在最坏的情况下,它可能比使用常规锁定使用多的内存。
· 除了行级锁定外,你可以使用应用程序级锁定,例如在MySQL中使用GET_LOCK()和RELEASE_LOCK()。这些是建议性锁定,它们只能在运行良好的应用程序中工作。
而我用的解决方案是用单线程,用了一个查询服务,对所有数据库操作都用单线程来执行
分享到:
相关推荐
在将数据库从MSSQL迁移到MySQL的过程中,基于业务逻辑的要求,需要在MySQL的自增列插入0值。在MSSQL中是这样完成的: 代码如下: string sql;sql = ” set identity_insert dbo.AppUsers on ” + ” insert dbo....
解决方案 困难 314 :locked: 中等的 313 中等的 312 中等的 311 :locked: 中等的 310 中等的 309 中等的 308 :locked: 难的 307 中等的 306 中等的 305 :locked: 难的 304 中等的 303 简单的 302 :locked: 中等的 ...
【标题】"auth-app::locked_with_key:| DevChallenges的身份验证应用程序解决方案" 提供了一个基于特定技术栈的身份验证应用实例,它主要用于用户登录、注册等安全操作。这个项目可能是一个开发挑战(DevChallenges...
在这种情况下,考虑在数据插入时确保字段不为空,或者使用NULL友好型的索引策略,可能是更优的解决方案。 5. **其他相关MySQL操作** - **模糊查询**:MySQL提供了`LIKE`操作符进行模糊匹配,配合`%`和`_`通配符...
本文将针对这些错误提供详细的解决方案,并解释其背后的原理。 #### 子进程post-installation script返回错误号1 此错误通常发生在软件包安装过程中,当软件包的post-installation脚本执行失败时。Post-...
此时,合理地定位错误并部署解决方案就显得尤为重要。可以使用`SHOW FULL PROCESSLIST;`命令来查看所有连接的进程,尤其是那些处于locked状态的进程,这些通常就是当前执行中卡死的进程,导致后续进程排队等待的原因...
下面我们将深入探讨这个问题的原因,并提供相应的解决方案。 **问题分析:** 当执行`executeUpdate`,例如进行增删改(INSERT, DELETE, UPDATE)操作时,JDBC会开启一个事务来确保数据的一致性。如果在执行这些操作...
尽管这种方式在性能上可能不如其他专门的锁机制(如信号量和文件锁),但它提供了一种简单且易于实现的解决方案,适用于对性能要求不那么高的应用场景。在实际项目中,可以根据具体需求和场景选择合适的锁实现策略。
更糟糕的是,一些用户可能会选择直接重启MySQL服务,但这只是暂时解决表面问题,而非根本解决方案。 在实验中,我们创建了一个名为`foo`的MyISAM表,这是一种不支持行级锁定的存储引擎,因此更容易引发锁定冲突。...
在寻找解决方案的过程中,作者参考了一篇关于MongoDB预分片的文章,但这并不适用于未使用自动分片的情况。接着,有人建议可能是由于数据文件预分配导致的问题,尤其是当系统IO负载较高时。虽然在作者的环境中(使用...
在Oracle、MySQL和DB2等数据库系统中,锁表的SESSION处理是解决并发操作时出现的锁定问题的重要方法。本篇文章将深入探讨锁表的SESSION处理方法,包括如何查询被锁住的SESSION信息,理解各种锁类型以及如何结束导致...
在高并发场景下,可能需要考虑分布式锁或缓存解决方案来优化性能。 6. **其他考虑因素** - **死锁检测与预防**:数据库系统通常具有死锁检测和恢复机制,但在应用层也可能需要额外的预防措施。 - **事务隔离级别*...
为了实现真正的分布式锁,我们需要一个跨服务的解决方案,使得所有服务实例都能感知到锁的状态。常用的分布式锁实现有基于Redis的SETNX命令、ZooKeeper的临时节点、etcd的lease机制等。这里以Redis为例,我们可以...