是否可以在不使用任何读锁的情况下在mysql中发出select查询?

时间:2010-01-07 07:46:14

标签: mysql performance innodb myisam

似乎mysql选择内容(而不是例如count)查询总是至少对myisam表上的表读锁定和对innodb表的行读锁定。有没有办法在mysql中发出一个选择内容查询(如果需要的话我可以更改表类型)而不需要抓取任何锁定?我不介意返回的数据是否不一致,因为我将它用于搜索索引。

2 个答案:

答案 0 :(得分:4)

使用InnoDB,您可以通过将事务隔离级别设置为:READ UNCOMMITTED来实现此目的。

在此隔离级别:

  

SELECT语句在a中执行   非锁定时尚,但有可能   行的早期版本可能是   用过的。因此,使用这种隔离   等级,这样的读数不一致。   这也称为“脏读”。   否则,此隔离级别有效   比如READ COMMITTED。

您可以从MySQL选项文件更改默认事务隔离级别,也可以为单个会话启用和禁用它:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM table_name;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

进一步阅读:MySQL Documentation: Set Transaction

答案 1 :(得分:1)

在没有LOCK TABLES的情况下,myisam应该等同于读取未提交模式,但它实际上并不支持任何事务类型......

innodb默认以“一致读取”模式运行(在“可重复读取”隔离级别),文档建议不会锁定:

  

如果事务隔离级别是   REPEATABLE READ(默认级别),   所有一致的读取都在同一个   事务读取快照   由第一个这样的读入建立   该交易

     

...

     

一致性读取是默认模式   哪个InnoDB处理SELECT   READ COMMITTED中的语句   REPEATABLE READ隔离级别。一个   一致读取不设置任何锁定   在它访问的表上,和   因此其他会议是免费的   同时修改那些表a   正在执行一致的读取   桌子。

     

...

     

InnoDB使用一致的读取   选择像INSERT INTO这样的子句......   SELECT,UPDATE ...(SELECT),和   CREATE TABLE ... SELECT没有   指定FOR UPDATE或LOCK IN SHARE   MODE如果   innodb_locks_unsafe_for_binlog选项   设置和隔离级别   事务未设置为   序列化。因此,没有设置锁   在从所选表中读取的行上。

http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html