0

我有一个应用程序已经运行了很长一段时间,但最近一些项目开始在慢查询日志中弹出。所有查询都是可以使用重构的复杂且丑陋的多连接选择语句。我相信它们都有斑点,这意味着它们被写入磁盘。让我好奇的部分是为什么他们中的一些人有与之相关的锁定时间。所有查询都没有应用程序设置的任何特定锁定协议。据我所知,除非明确指定,否则默认情况下您可以读取锁。

所以我的问题是:什么情况下会导致 select 语句必须等待锁定(从而在慢查询日志中报告)?假设 INNODB 和 MISAM 环境。

磁盘交互是否可以列为某种锁定时间?如果是的话,周围有没有说明这一点的文件?

提前致谢。

4

2 回答 2

0

MyISAM 会给你并发问题,当插入进行时整个表被完全锁定。

InnoDB 在读取方面应该没有问题,即使由于它的 MVCC 正在进行写入/事务。

然而,仅仅因为查询显示在慢查询日志中并不意味着查询很慢 - 多少秒,多少条记录正在被检查?

将“EXPLAIN”放在查询前面以获得查询正在进行的检查的细目。

这是学习 EXPLAIN的一个很好的资源(在关于它的优秀 MySQL 文档之外)

于 2011-11-16T00:27:25.467 回答
-1

我不确定 MySql,但我知道在 SQL Server 中选择语句不会读取锁。这样做将允许您读取未提交的数据,并可能会看到重复的记录或完全错过记录。这样做的原因是,如果另一个进程正在写入表,数据库引擎可能会决定是时候重新组织一些数据并将其转移到磁盘上。因此,它将您已经阅读的记录移动到最后,然后您再次看到它,或者它从最后移动到您已经过去的更高位置。

网上某个地方的某个人实际上写了几个脚本来证明这种情况发生了,我尝试了一次,只花了几秒钟就出现了重复。当然,他设计剧本的方式是让它更有可能发生,但这证明它绝对可以发生。

如果您的数据不需要准确并且当然可以帮助防止死锁,那么这是可以的行为。但是,如果您正在开发一个处理诸如人们的钱之类的应用程序,那就非常糟糕了。

在 SQL Server 中,您可以使用 WITH NOLOCK 提示告诉您的选择语句忽略锁。我不确定 MySql 中的等价物是什么,但也许这里的其他人会说。

于 2011-11-15T23:47:20.227 回答