Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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_Sql_Performance - Fatal编程技术网

MySql查询,不影响其他操作

MySql查询,不影响其他操作,mysql,sql,performance,Mysql,Sql,Performance,我有一个巨大的(设计糟糕的)InnoDB表,有数百万条记录。当我询问这个人时,死刑会持续几分钟。我如何确保在此期间其他操作(查询、插入或更新)不受影响?我最不想看到的是在我的查询运行时其他人的死锁或超时 这是实际的查询 SELECT html FROM cms_log where class_name ='main_pages' order by date_created desc; 现在“class_name”字段没有索引,但这是我目前无法更改的 建议使用 SET TRANSACTION I

我有一个巨大的(设计糟糕的)InnoDB表,有数百万条记录。当我询问这个人时,死刑会持续几分钟。我如何确保在此期间其他操作(查询、插入或更新)不受影响?我最不想看到的是在我的查询运行时其他人的死锁或超时

这是实际的查询

SELECT html FROM cms_log where class_name ='main_pages' order by date_created desc;
现在“class_name”字段没有索引,但这是我目前无法更改的

建议使用

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

在运行我的查询之前。但这是一个相当古老的帖子,它只提到锁。有人能确认这是一种方法,或者给出一种更好的方法来运行最无害的查询吗?(另外,我不喜欢脏的和虚幻的阅读,我只是不想影响其他操作)。

我不同意你发布的链接。将隔离级别设置为READ UNCOMMITTED不应使select查询更快/以不同方式影响任何其他查询

在InnoDB中,像您这样的纯select不应该锁定任何东西(除了它们自己的内部数据结构)

通常,SELECT可以锁定读、写或无。取决于上下文。在此上下文中,如果您没有显式请求锁,并且没有更新任何内容,则不应使用行锁


这是假设您正常运行的是读取提交或可重复读取隔离级别。

因此,这似乎是一种解决方法

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

在查询之前执行此操作似乎可以确保在执行此长查询时,没有其他操作会出现可怕的“锁定等待超时”。

您可以设置副本吗?然后您可以在不影响主数据库的情况下查询副本。+如果您不介意粘贴查询,我们可以帮助您优化it@DanLowe这是一个很好的观点,我将不做任何扩展,即从属系统中的附加索引(主系统中不存在相同的索引)是受支持的有效配置,当然除了唯一的索引,在一个地方而不是另一个地方没有意义。。。但是,对母版进行适当索引的重要性怎么强调都不够。我不同意你的意见。:)我从来没有弄清楚该机制是什么,但我确信我在“线程2”中遇到了一个令人困惑的“锁定等待超时超过”,而“线程1”正在执行一个长时间运行的非锁定选择,从一个本不应该持有锁的事务中。将“线程1”改为使用
readuncommitted
解决了这个问题,在那之前,这个问题一直是日常的刺激因素。当长时间运行的
SELECT
仍在进行时,InnoDB似乎会在其他隔离级别上执行一些操作,导致其他线程等待写入。