Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
慢速查询日志中的Mysql锁定时间_Mysql_Locking_Mysql Slow Query Log - Fatal编程技术网

慢速查询日志中的Mysql锁定时间

慢速查询日志中的Mysql锁定时间,mysql,locking,mysql-slow-query-log,Mysql,Locking,Mysql Slow Query Log,我有一个应用程序已经运行了很长一段时间了,但是最近在慢速查询日志中出现了一些项目。 所有查询都是复杂难看的多连接选择语句,可以使用重构。我相信它们都有blob,这意味着它们会被写入磁盘。让我好奇的是,为什么他们中的一些人有一个与他们相关的锁定时间。没有一个查询具有应用程序设置的任何特定锁定协议。据我所知,默认情况下,除非明确指定,否则可以读取锁 那么我的问题是:什么样的场景会导致select语句必须等待锁定(从而在慢速查询日志中报告)?假设INNODB和MYISAM环境都存在 磁盘交互是否可以列

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

那么我的问题是:什么样的场景会导致select语句必须等待锁定(从而在慢速查询日志中报告)?假设INNODB和MYISAM环境都存在

磁盘交互是否可以列为某种锁定时间?如果是,是否有相关文件说明了这一点


提前感谢。

我对MySql不太确定,但我知道在SQL Server中,select语句不会针对锁进行读取。这样做将允许您读取未提交的数据,并可能看到重复记录或完全丢失记录。这样做的原因是,如果另一个进程正在向表中写入数据,数据库引擎可能会决定是时候重新组织一些数据并将其在磁盘上移动。因此,它会将您已经读取的记录移动到末尾,您会再次看到它,或者它会将一条记录从末尾向上移动到您已经通过的位置

网上某个地方有个家伙写了几个脚本来证明这一点,我试过一次,只花了几秒钟就出现了一个副本。当然,他设计脚本的方式会使它更有可能发生,但这证明了它肯定会发生

如果您的数据不需要精确,这是可以接受的行为,当然可以帮助防止死锁。然而,如果你正在开发一个应用程序来处理像人们的钱这样的东西,那就太糟糕了


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

MyISAM会给您带来并发性问题,在插入过程中,整个表会被完全锁定

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

然而,仅仅因为查询显示在慢速查询日志中并不意味着查询是慢速的——检查了多少秒,多少记录

将“EXPLAIN”放在查询前面,以获取查询中正在进行的考试的明细


为了学习EXPLAIN(在优秀的MySQL文档之外)

我真是太蠢了。我认为这是一个教科书问题。我忘记了在更新过程中表会完全锁定。有很多微小的更新不断发生。这些古怪而缓慢的查询基本上造成了交通堵塞,不断的更新确保了它永远不会停止。