前记
前几天收到一位同行的一个文档,是MySQL High Performance 2的读书笔记, 97页,6w多字。在描述完知识点后,有疑问的地方列出问题,希望和我讨论。看完以后非常敬佩,自感自己无法做到这么细心。为表敬意,承诺会一一回答里面的问题。对于无法简单回复的问题,就想通过博客的方式写出来,便于讨论。
因此这个系列,就是回复这位同学的文档中的问题的。
问题
服务器变量table_locks_immediate和 table_locks_waited#?它们保持多大的比例是合适的?
背景
table_locks_immediate表示可以立即获取锁的查询次数, table_locks_waited表示不能立即获取锁的次数;
Session 1 |
Session 2 |
lock tables t1 read; (table_locks_immediate+1) |
|
|
update t1 set y=1 where id=1; (locked并且table_locks_waited+1) |
上面这个例子很简单,session 1加了表所,但是session 2要更新,获取表锁失败。
异象
Session 1 |
Session 2 |
lock tables t1 write; (table_locks_immediate+1) |
|
|
update t1 set y=1 where id=1; (locked但table_locks_waited不变) |
这个例子看上去像个bug,session 1锁表,session 2试图更新这个表,被锁住了,但是table_locks_waited没有加1,而且查看table_locks_immediate也不变。
其原因是5.5新引入的metadata lock(MDL),对表的访问都需要获取MDL。在这个例子中,session 1拥有一个排他MDL,因此Session2是被锁在获取MDL的阶段。
由于MDL是在获取表锁之前,因此在session 2被lock的时,上述两个变量都不变。
什么情况下会触发table_locks_waited
从上面这个例子看,引入MDL以后,table_locks_waited并不容易触发。除非应用主动作lock tables t read。
我们用并发压力,两个线程分别执行update t1 set y=y+1 where id=1;各5000次。
若t1为MyISAM表,MyISAM是表锁,在并发压力下,是会导致table_locks_waited急剧增加。
而在InnoDB表,由于是行锁,因此获取表锁这个逻辑都能顺利通过,因此table_locks_waited不变。
table_locks_waited多少合适
回到初始的问题,若库中都是InnoDB的表,在5.5以后,table_locks_waited这个值应该很小。在mysqldump导出表时,会执行lock table,可能导致此值增加。其他情况下,若这个值有变,说明应用端主动作了lock table,这个在InnoDB表上是不需要的,需要应用修改。
相关推荐
MySQL的锁主要分为乐观锁和悲观锁,乐观锁一般是程序自己实现,可以根据版本号或者时间戳字段实现 MySQL表级锁 表级锁由MySQL Layer层实现 MySQL 实现的表级锁定的争用状态变量 show status like 'table%'; table...
where c.owner = upper('&table_owner') and c.table_name = upper('&table_name') and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position; 8、存储函数和过程 查看函数...
Another type of table lock is a schema stability lock (Sch-S) and is compatible with all table locks except the schema modification lock (Sch-M). The schema modification lock (Sch-M) is incompatible ...
alter table TABLE_NAME add constraint KEY_NAME primary key (TABLE_COLUMN) using index tablespace TABLE_SPACE_NAME; 2.增加外键 alter table TABLE_NAME add constraint FK_NAME foreign key (TABLE_COLUMN)...
EXECUTE IMMEDIATE 'DROP TABLE [table_name]'; EXCEPTION WHEN OTHERS THEN NULL; END; 3,在Sql Server中 IF EXISTS ( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '[table_name]...
db_generate.sql# phpMyAdmin MySQL-Dump # http://phpwizard.net/phpMyAdmin/ # # -------------------------------------------------------- # # Table structure for table 'mantis_bug_table' # DROP TABLE ...
Oracle中EXECUTE IMMEDIATE用法
2) CPSIE and CPSID formats are changed, use "iflags_aif" form instead of "aif" (eg. "CPSIE iflags_i" instead of "CPSID i") 3) SRS with writeback must have a separating space after the mode number and...
用execute immediate 执行备份恢复SQLSVR数据库
Oracle9RMAN设置和配置 RMAN设置和配置 1.9i下将数据库配置为ARCHIVELOG模式 虽说RMAN也可以在非归档模式下使用,但是我们不推荐。因为非归档模式下很多RMAN的功能都用不上。在9i中必须配置如下参数: 􀂾 ...
在Oracle中若删除一个不存在的表,如 “DROP TABLE tableName”,则会提示: ORA-00942:表或视图不存在 若在程序中执行该语句则会报异常,这就需要...EXECUTE IMMEDIATE 'DROP TABLE tableName'; END IF; END; 在Oracle中
洛杉矶知名音乐制作公司Immediate Music是一个为好莱坞等欧美无数电影大片的预告片制作背景音乐的专业音乐制作公司,外界对其旗下艺人知之不多,颇为神秘,Immediate Music 管弦乐团有强烈史诗风格,多被采用于电影...
execute immediate 用法研究 为初学者打造。
// Find all the immediate upstream or downstream peers of a filter. HRESULT Demux::GetPeerFilters( IBaseFilter *pFilter, // Pointer to the starting filter PIN_DIRECTION Dir, // Direction to search ...
Jobs are the immediate worry— whole industry sectors could face substantial disruption soon, and with unknown consequences. In response to these challenges, Anastassia Lauterbach and Andrea Bonime-...
基于Qt5.9.1的简单登录界面demo
动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 — 使用技巧 ...
where c.owner = upper('&table_owner') and c.table_name = upper('&table_name') and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position; 8、存储函数和过程 查看函数...
oracle动态sql之EXECUTE IMMEDIATE.docx
immediate immediate设为true后,则监听的这个对象会立即输出,也就是说一刷新页面就会在控制台输出,当然此时页面上的数据我们还没来得及手动让其发生变化,所以在控制台输出的newValue为我们在代码中默认设置的值...