mysql锁表机制
MySQL中的表锁和行锁的适用场景和注意事项

MySQL中的表锁和行锁的适用场景和注意事项MySQL是一种常用的开源关系型数据库管理系统,广泛应用于各种类型的应用程序中。
在MySQL中,锁的使用是非常重要的,它能够确保数据的完整性和一致性。
在MySQL中,有两种主要的锁类型,分别是表锁和行锁。
本文将探讨MySQL中的表锁和行锁的适用场景和注意事项。
1. 表锁表锁是MySQL中最基本的锁类型,它可以锁定整个表,阻止其他用户对该表的写操作。
表锁适用于以下场景:1.1 需要对整个表进行操作的场景在某些情况下,我们可能需要对整个表进行操作,例如对表结构进行修改、清空表数据等。
这时,使用表锁可以确保在操作过程中其他用户无法对表进行读写操作,保证操作的完整性。
1.2 需要进行大量数据插入或更新的场景在进行大量数据插入或更新的情况下,如果不使用表锁,可能会导致频繁的行级锁竞争,从而降低性能。
而使用表锁可以减少锁的竞争,提高操作效率。
然而,表锁也存在一些注意事项:1.3 并发性低由于表锁是对整个表进行锁定,所以在使用表锁时并发性较低,即其他用户无法同时对表进行读写操作。
如果在多用户环境下,频繁使用表锁可能会导致性能瓶颈。
1.4 锁粒度较大表锁的锁粒度较大,当一个用户对表进行写操作时,其他用户无法对表进行读写操作。
这样可能会导致其他用户需要等待较长时间,从而影响用户体验。
2. 行锁行锁是MySQL中更细粒度的锁类型,它可以在表的行级别上进行锁定。
行锁适用于以下场景:2.1 需要对表的部分数据进行操作的场景在一些场景下,我们只需要针对表中的部分数据进行操作,而不是整个表。
这时使用行锁可以避免不必要的锁竞争,提高并发性能。
2.2 需要在事务中对多个行进行操作的场景在事务中,我们可能需要对多个行进行操作,如果不使用行锁,可能会导致数据不一致。
使用行锁可以确保在事务中对行的操作是原子性的,从而保证数据的完整性和一致性。
然而,行锁也存在一些注意事项:2.3 锁粒度较小行锁的锁粒度较小,如果在高并发的情况下频繁使用行锁,可能会导致大量的锁竞争,降低性能。
mysql 读写锁实现原理

mysql 读写锁实现原理
MySQL中的读写锁实现原理涉及到数据库并发控制的重要概念。
在MySQL中,读写锁是通过表级锁和行级锁来实现的。
首先,让我们来看一下读锁的实现原理。
读锁是共享锁,允许
多个事务同时获取读锁,以便并发读取数据而不会相互影响。
当一
个事务获取了读锁之后,其他事务也可以获取读锁,但是如果有其
他事务获取了写锁,则读锁会被阻塞,直到写锁被释放。
这种机制
可以保证读操作不会被写操作所阻塞,从而提高了数据库的并发性能。
接下来是写锁的实现原理。
写锁是排他锁,一旦一个事务获取
了写锁,其他事务无法获取读锁或者写锁,从而保证了数据的一致性。
当一个事务获取了写锁之后,其他事务无法进行读写操作,直
到写锁被释放。
这种机制可以保证写操作的原子性和一致性。
在MySQL中,读写锁的实现原理是基于锁的粒度来进行的,可
以通过锁定整个表或者锁定表中的某些行来实现。
在实际应用中,
可以通过使用SELECT ... FOR UPDATE语句来获取行级的写锁,或
者使用LOCK TABLES语句来获取表级的锁。
另外,MySQL还提供了
事务的隔离级别,可以通过设置不同的隔离级别来控制读写锁的行为。
总的来说,MySQL中的读写锁实现原理是基于锁的类型和粒度来保证数据的并发访问和一致性。
通过合理地使用读写锁,可以提高数据库的并发性能和数据的一致性。
MySQL中的锁(表锁、行锁)

MySQL中的锁(表锁、⾏锁)锁是计算机协调多个进程或纯线程并发访问某⼀资源的机制。
在数据库中,除传统的计算资源(CPU、RAM、I/O)的争⽤以外,数据也是⼀种供许多⽤户共享的资源。
如何保证数据并发访问的⼀致性、有效性是所在有数据库必须解决的⼀个问题,锁冲突也是影响数据库并发访问性能的⼀个重要因素。
从这个⾓度来说,锁对数据库⽽⾔显得尤其重要,也更加复杂。
概述相对其他数据库⽽⾔,MySQL的锁机制⽐较简单,其最显著的特点是不同的存储引擎⽀持不同的锁机制。
MySQL⼤致可归纳为以下3种锁:表级锁:开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突的概率最⾼,并发度最低。
⾏级锁:开销⼤,加锁慢;会出现死锁;锁定粒度最⼩,发⽣锁冲突的概率最低,并发度也最⾼。
页⾯锁:开销和加锁时间界于表锁和⾏锁之间;会出现死锁;锁定粒度界于表锁和⾏锁之间,并发度⼀般----------------------------------------------------------------------MySQL表级锁的锁模式(MyISAM)MySQL表级锁有两种模式:表共享锁(Table Read Lock)和表独占写锁(Table Write Lock)。
对MyISAM的读操作,不会阻塞其他⽤户对同⼀表请求,但会阻塞对同⼀表的写请求;对MyISAM的写操作,则会阻塞其他⽤户对同⼀表的读和写操作;MyISAM表的读操作和写操作之间,以及写操作之间是串⾏的。
当⼀个线程获得对⼀个表的写锁后,只有持有锁线程可以对表进⾏更新操作。
其他线程的读、写操作都会等待,直到锁被释放为⽌。
MySQL表级锁的锁模式MySQL的表锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
锁模式的兼容如下表MySQL中的表锁兼容性当前锁模式/是否读锁写锁兼容/请求锁模式读锁是否写锁否否可见,对MyISAM表的读操作,不会阻塞其他⽤户对同⼀表的读请求,但会阻塞对同⼀表的写请求;对MyISAM表的写操作,则会阻塞其他⽤户对同⼀表的读和写请求;MyISAM表的读和写操作之间,以及写和写操作之间是串⾏的!(当⼀线程获得对⼀个表的写锁后,只有持有锁的线程可以对表进⾏更新操作。
MySQL中的表锁和行锁的区别与应用

MySQL中的表锁和行锁的区别与应用MySQL是一种广泛使用的关系型数据库管理系统,它具有高性能、高可靠性和易于使用等优点。
在使用MySQL时,我们可能会遇到表锁和行锁两种不同的锁机制。
本文将探讨MySQL中的表锁和行锁的区别与应用,以帮助读者更好地理解和使用这两种锁。
一、概念解析1. 表锁表锁是MySQL中最基本的锁机制,它是对整个表进行加锁。
当一个事务获取了表锁后,其他事务就无法对该表进行任何修改操作,直到锁被释放。
表锁是一种粗粒度锁,它对数据并发访问的并发性能影响比较大。
2. 行锁行锁是MySQL中的一种细粒度锁,它是对表中的行进行加锁。
当一个事务获取了某一行的行锁后,其他事务可以继续对该表的其他行进行操作,只有对同一行有冲突的事务才会被阻塞。
行锁相较于表锁,能够提高并发性能。
二、表锁和行锁的区别1. 锁的粒度表锁是对整张表进行加锁,锁的粒度比较大;而行锁是对表中的行进行加锁,锁的粒度比较小。
2. 并发性能由于锁的粒度不同,导致了表锁的并发性能较差。
当一个事务获取了表锁后,其他事务无法对该表进行任何修改操作,这就导致了并发度的下降。
而行锁只对被操作行进行加锁,不会影响其他行的操作,因此并发性能较好。
3. 锁的开销由于锁的粒度不同,表锁的开销一般比行锁的开销要小。
因为行锁需要记录更多的锁信息,而表锁只需要记录一个锁即可。
4. 冲突范围表锁对整张表起作用,会阻塞整个表的修改操作;而行锁对某一行起作用,只有对同一行有冲突的事务才会被阻塞。
三、表锁和行锁的应用场景1. 表锁的应用场景表锁适用于以下情况:- 需要对整个表进行操作,并发度较低的情况下,使用表锁可以简化锁的管理,降低系统开销。
- 频繁地进行读写操作,且写操作较少的情况下,使用表锁可以避免锁冲突带来的性能问题。
2. 行锁的应用场景行锁适用于以下情况:- 频繁地进行读写操作,且写操作较多的情况下,使用行锁可以提高并发性能,减少锁冲突带来的性能问题。
MYSQL解锁与锁表

MYSQL解锁与锁表MySQL锁概述相对其他数据库⽽⾔,MySQL的锁机制⽐较简单,其最显著的特点是不同的存储引擎⽀持不同的锁机制。
⽐如,MyISAM和MEMORY存储引擎采⽤的是表级锁(table-level locking);BDB存储引擎采⽤的是页⾯锁(page-level locking),但也⽀持表级锁;InnoDB存储引擎既⽀持⾏级锁(row-level locking),也⽀持表级锁,但默认情况下是采⽤⾏级锁。
MySQL这3种锁的特性可⼤致归纳如下。
开销、加锁速度、死锁、粒度、并发性能l 表级锁:开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突的概率最⾼,并发度最低。
l ⾏级锁:开销⼤,加锁慢;会出现死锁;锁定粒度最⼩,发⽣锁冲突的概率最低,并发度也最⾼。
l 页⾯锁:开销和加锁时间界于表锁和⾏锁之间;会出现死锁;锁定粒度界于表锁和⾏锁之间,并发度⼀般。
MyISAM表锁MyISAM存储引擎只⽀持表锁,这也是MySQL开始⼏个版本中唯⼀⽀持的锁类型。
随着应⽤对事务完整性和并发性要求的不断提⾼,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了⽀持页锁的BDB存储引擎和⽀持⾏锁的InnoDB存储引擎(实际 InnoDB是单独的⼀个公司,现在已经被Oracle公司收购)。
但是MyISAM的表锁依然是使⽤最为⼴泛的锁类型。
本节将详细介绍MyISAM表锁的使⽤。
查询表级锁争⽤情况可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:mysql> show status like 'table%';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| Table_locks_immediate | 2979 || Table_locks_waited | 0 |+-----------------------+-------+2 rows in set (0.00 sec))如果Table_locks_waited的值⽐较⾼,则说明存在着较严重的表级锁争⽤情况。
mysql 行锁的原理

mysql 行锁的原理MySQL是一款广泛使用的关系型数据库管理系统,它支持多种锁机制来保护数据并发访问。
其中,行锁是MySQL中一种常见的锁类型,用于控制对数据库表中行的访问。
本篇文章将介绍MySQL行锁的原理,包括其实现方式、适用场景以及注意事项。
一、行锁的实现方式MySQL的行锁是通过索引实现的。
当一个事务需要修改一行数据时,MySQL会先检查该行是否已经被其他事务锁定。
如果没有被锁定,则对该行进行锁定,并执行相应的更新操作。
如果该行已经被锁定,则事务需要等待,直到锁定释放。
MySQL使用索引来锁定行,这是因为索引能够提高数据库的查询性能。
通过索引,MySQL能够快速定位到需要修改的行,从而减少了对整个表进行锁定的开销。
在锁定行时,MySQL会根据索引键来获取相应的行数据页(RowDataPage,简称RDP)。
一旦获取到RDP,就可以对其进行锁定和修改操作。
二、行锁的适用场景行锁适用于高并发、数据量较大的场景,能够提高数据库的并发性能和响应速度。
以下是一些适用行锁的场景:1.更新操作:当事务需要修改一行数据时,使用行锁能够保证数据的一致性和完整性。
2.插入操作:当事务需要插入一行数据时,可以使用行锁来防止其他事务对同一行数据进行修改。
3.删除操作:当事务需要删除一行数据时,可以使用行锁来确保数据的一致性。
三、行锁的注意事项在使用行锁时,需要注意以下几点:1.锁定的粒度:合理的锁粒度可以提高并发性能和降低死锁的可能性。
过细的锁粒度会增加系统开销,而过粗的锁粒度则可能导致数据不一致性。
2.锁定的范围:锁定范围越小,系统受到的影响就越小,但同时也可能降低并发性能。
因此,需要根据具体场景来选择合适的锁定范围。
3.死锁处理:死锁是并发编程中常见的问题之一。
在使用行锁时,需要采取适当的措施来避免死锁的发生,例如设置超时时间、使用锁顺序等。
4.锁定的释放:在事务结束或失败时,需要及时释放所持有的锁,以避免长时间占用资源或导致死锁。
MySQL中的表锁与行锁的使用场景

MySQL中的表锁与行锁的使用场景MySQL是一款常用的关系型数据库管理系统,具有广泛的应用场景。
在实际使用中,MySQL的表锁和行锁是非常重要的概念和机制。
本文将重点探讨MySQL中的表锁和行锁的使用场景,并分析它们的优缺点。
一、表锁的使用场景1. 大量写操作的场景:当有大量的并发写操作需要同时更新表中的数据时,使用表锁可以避免多个写操作同时发生,从而保证数据的准确性。
表锁的粒度大,锁定整个表,因此可以减少锁的竞争,提高写操作的效率。
2. 数据表结构修改的场景:当需要对表的结构进行修改,如增加、删除或修改列时,使用表锁可以确保表结构修改的原子性。
表锁可以避免其他读操作或写操作对表结构修改的干扰,保证表结构的完整性。
3. 数据表备份和恢复的场景:当需要对数据表进行备份或恢复时,使用表锁可以确保备份或恢复操作的原子性。
通过锁定整个表,可以保证备份或恢复操作的一致性,避免数据不完整或出现意外情况。
二、行锁的使用场景1. 高并发读写操作的场景:当有大量的并发读写操作需要同时访问表中的数据时,使用行锁可以避免读写操作之间的冲突。
行锁的粒度小,只锁定需要修改的行,可以减少锁的竞争,提高读写操作的效率。
2. 多表关联查询的场景:当需要进行多表关联查询时,使用行锁可以避免其他查询操作对当前查询的干扰。
通过锁定表中的某些行,可以确保关联查询的结果的准确性,避免数据出现混乱或错误的情况。
3. 事务操作的场景:在事务操作中,使用行锁可以确保事务的一致性和隔离性。
通过锁定要修改的行,可以避免其他事务对该行数据的修改,保证事务操作的原子性和完整性。
三、表锁和行锁的优缺点1. 表锁的优点是简单、高效,适用于大量写操作和表结构修改的场景。
它的粒度大,可以减少锁的竞争,从而提高写操作的效率。
2. 表锁的缺点是粒度大,无法细粒度地控制锁定的范围,容易造成锁的冲突和等待。
当多个写操作需要同时发生时,表锁会导致其他写操作被阻塞,降低了并发性能。
MySQL中的数据库锁定和解锁技巧

MySQL中的数据库锁定和解锁技巧MySQL是最流行的关系型数据库管理系统之一,被广泛应用于Web应用程序的开发中。
在MySQL中,数据库锁定和解锁技巧是非常重要的主题,因为锁定数据可以确保数据的完整性和一致性,并防止并发操作引发的问题。
在本文中,我们将讨论MySQL中的数据库锁定和解锁技巧,深入探讨不同类型的锁定以及如何正确使用它们。
一、引言MySQL中的数据库锁定和解锁是为了防止多个并发事务对同一数据进行修改而引发的数据冲突问题。
当多个事务同时对同一数据进行读写操作时,如果没有适当的锁定机制,就会出现数据不一致的情况。
因此,在MySQL中正确使用锁定机制对于保证数据的一致性和完整性至关重要。
二、MySQL中的锁定机制MySQL中的锁定机制可以分为两种类型:共享锁和排他锁。
共享锁用于保护读操作,而排他锁用于保护写操作。
共享锁可以同时被多个事务获取,但是排他锁只能被一个事务获取。
通过正确地使用这两种锁定机制,可以确保数据的完整性和一致性。
1. 共享锁共享锁可以被多个事务同时获取,它用于保护读操作,即多个事务可以同时读取同一份数据而不会造成数据不一致的问题。
当一个事务获取了共享锁后,其他事务可以继续获取共享锁,但是无法获取排他锁,直到该事务释放了共享锁。
在MySQL中,可以使用以下语句获取共享锁:```SELECT * FROM table_name LOCK IN SHARE MODE;```2. 排他锁排他锁只能被一个事务获取,它用于保护写操作,即当一个事务获取了排他锁后,其他事务无法获取共享锁或排他锁,直到该事务释放了排他锁。
这样可以确保在写操作期间不会有其他事务对数据进行读或写操作,从而保证了数据的完整性。
在MySQL中,可以使用以下语句获取排他锁:```SELECT * FROM table_name FOR UPDATE;```三、使用锁定机制的注意事项在使用MySQL中的锁定机制时,需要注意以下几点:1. 锁的粒度在MySQL中,可以对表级别、行级别甚至列级别进行锁定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mysql查询更新时的锁表机制分析创建时间:2010-05-25文章类别:服务器端文章大小:4431 Bytes转载: MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。
在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出某个给出的锁类型就比另一个好。
一切取决于应用程序,应用程序的不同部分可能需要不同的锁类型。
为了确定是否想要使用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什么样的选择和更新语句。
例如,大多数Web应用程序执行许多选择,而很少进行删除,只对关键字的值进行更新,并且只插入少量具体的表。
基本MySQL MyISAM设置已经调节得很好。
在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。
这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。
对WRITE,MySQL使用的表锁定方法原理如下:如果在表上没有锁,在它上面放一个写锁。
否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:如果在表上没有写锁定,把一个读锁定放在它上面。
否则,把锁请求放在读锁定队列中。
当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。
这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:mysql> SHOW STATUS LIKE 'Table%';+-----------------------+---------+| Variable_name | Value |+-----------------------+---------+| Table_locks_immediate | 1151552 || Table_locks_waited | 15324 |+-----------------------+---------+如果INSERT语句不冲突,可以自由为MyISAM表混合并行的INSERT和SELECT 语句而不需要锁定。
也就是说,你可以在其它客户正读取MyISAM表的时候插入行。
如果数据文件中间不包含空闲块,不会发生冲突,因为在这种情况下,记录总是插入在数据文件的尾部。
(从表的中部删除或更新的行可能导致空洞)。
如果有空洞,当所有空洞填入新的数据时,并行的插入能够重新自动启用。
如果不能同时插入,为了在一个表中进行多次INSERT和SELECT操作,可以在临时表中插入行并且立即用临时表中的记录更新真正的表。
这可用下列代码做到:mysql> LOCK TABLES real_table WRITE, insert_table WRITE;mysql> INSERT INTO real_table SELECT * FROM insert_table;mysql> TRUNCATE TABLE insert_table;mysql> UNLOCK TABLES;InnoDB使用行锁定,BDB使用页锁定。
对于这两种存储引擎,都可能存在死锁。
这是因为,在SQL语句处理期间,InnoDB自动获得行锁定和BDB获得页锁定,而不是在事务启动时获得。
行级锁定的优点:· 当在许多线程中访问不同的行时只存在少量锁定冲突。
· 回滚时只有少量的更改。
· 可以长时间锁定单一的行。
行级锁定的缺点:· 比页级或表级锁定占用更多的内存。
· 当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。
· 如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。
· 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
在以下情况下,表锁定优先于页级或行级锁定:· 表的大部分语句用于读取。
· 对严格的关键字进行读取和更新,你可以更新或删除可以用单一的读取的关键字来提取的一行:· UPDATE tbl_name SET column=value WHEREunique_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()。
这些是建议性锁定,它们只能在运行良好的应用程序中工作。
为达到最高锁定速度,除InnoDB和BDB之外,对所有存储引擎,MySQL使用表锁定(而不是页、行或者列锁定)。
对于InnoDB和BDB表,如果你用LOCK TABLES显式锁定表,MySQL只使用表锁定。
对于这些表类型,我们建议你根本不要使用LOCK TABLES,因为InnoDB使用自动行级锁定而BDB使用页级锁定来保证事务隔离。
对于大表,对于大多数应用程序,表锁定比行锁定更好,但存在部分缺陷。
表锁定使许多线程同时从一个表中进行读取操作,但如果一个线程想要对表进行写操作,它必须首先获得独占访问。
更新期间,所有其它想要访问该表的线程必须等待直到更新完成。
表更新通常情况认为比表检索更重要,因此给予它们更高的优先级。
这应确保更新一个表的活动不能“饿死”,即使该表上有很繁重的SELECT活动。
表锁定在这种情况下会造成问题,例如当线程正等待,因为硬盘已满并且在线程可以处理之前必须有空闲空间。
在这种情况下,所有想要访问出现问题的表的线程也被设置成等待状态,直到有更多的硬盘空间可用。
表锁定在下面的情况下也存在问题:· 一个客户发出长时间运行的查询。
· 然后,另一个客户对同一个表进行更新。
该客户必须等待直到SELECT完成。
· 另一个客户对同一个表上发出了另一个SELECT语句。
因为UPDATE 比SELECT优先级高,该SELECT语句等待UPDATE完成,并且等待第1个SELECT 完成。
下面描述了一些方法来避免或减少表锁定造成的竞争:· 试图使SELECT语句运行得更快。
你可能必须创建一些摘要(summary)表做到这点。
· 用--low-priority-updates启动mysqld。
这将给所有更新(修改)一个表的语句以比SELECT语句低的优先级。
在这种情况下,在先前情形的第2个SELECT语句将在UPDATE语句前执行,而不需要等候第1个SELECT完成。
· 可以使用SET LOW_PRIORITY_UPDATES=1语句指定具体连接中的所有更新应使用低优先级。
参见13.5.3节,“SET语法”· 可以用LOW_PRIORITY属性给与一个特定的INSERT、UPDATE或DELETE语句较低优先级。
· 可以用HIGH_PRIORITY属性给与一个特定的SELECT语句较高优先级。
参见13.2.7节,“SELECT语法”。
· 为max_write_lock_count系统变量指定一个低值来启动mysqld来强制MySQL在具体数量的插入完成后临时提高所有等待一个表的SELECT语句的优先级。
这样允许在一定数量的WRITE锁定后给出READ锁定。
· 如果你有关于INSERT结合SELECT的问题,切换到使用新的MyISAM 表,因为它们支持并发的SELECT和INSERT。
· 如果你对同一个表混合插入和删除,INSERT DELAYED将会有很大的帮助。
参见13.2.4.2节,“INSERT DELAYED语法”。
· 如果你对同一个表混合使用SELECT和DELETE语句出现问题,DELETE 的LIMIT选项可以有所帮助。
参见13.2.1节,“DELETE语法”。
· 对SELECT语句使用SQL_BUFFER_RESULT可以帮助使表锁定时间变短。
参见13.2.7节,“SELECT语法”。
· 可以更改mysys/thr_lock.c中的锁代码以使用单一的队列。
在这种情况下,写锁定和读锁定将具有相同的优先级,对一些应用程序会有帮助。
这里是一些MySQL中表锁定相关的技巧:· 如果不混合更新与需要在同一个表中检查许多行的选择,可以进行并行操作。
· 可以使用LOCK TABLES来提高速度,因为在一个锁定中进行许多更新比没有锁定的更新要快得多。
将表中的内容切分为几个表也可以有所帮助。