MyISAM引擎特点简述
- 不支持事务
- 不支持外键
- 较小的逐渐范围
- 支持全文检索
- 不支持GIB数据
- 查询效率高
- 使用表锁
表锁特点
锁住整个表,所以开销小,加锁比较快,无死锁情况,锁的粒度较大,在并发情况下,产生锁等待的概率比较高,所以支持的并发数较低,一般用于查找。
表锁类型
- 读锁:也称为共享锁,针对同一张表,多并发读操作可以并行执行,并且互不影响,写会发生阻塞。
- 写锁:也称为排它锁,针对同一张表,当前线程写操作时,会阻塞其他线程的读写操作。
手动表锁语法
mysql> LOCK TABLE 表名 [READ | WRITE] [,表名 [READ | WRITE]...] #加锁
mysql> UNLOCK TABLES #解锁
状态查询
mysql> SHOW STATUS LIKE 'Table_locks_immediate';
表示可以立即获取锁的查询次数,每获取一次锁就增加1
mysql> SHOW STATUS LIKE 'Table_locks_waited';
表示锁等待的次数
最佳实践
读锁(共享锁)
步骤 | Session1 | Session2 |
1 | 给myisam_lock加读锁 | |
2 | 可以查询myisam_lock表数据 | 可以查询myisam_lock表数据 |
3 | 不可以增删改myisam_lock表数据 | 增删改myisam_lock表数据阻塞 |
4 | 不可以增删改查其他表数据 | 可以增删改查其他表数据 |
5 | 释放myisam_lock的读锁 | 释放读锁同时阻塞的增删改成功 |
写锁(排它锁)
步骤 | Session1 | Session2 |
1 | 给myisam_lock加写锁 | |
2 | 可以查询myisam_lock表数据 | 查询myisam_lock表数据阻塞 |
3 | 释放myisam_lock的写锁 | 释放写锁同时阻塞的查询成功 |
4 | 给myisam_lock加写锁 | |
5 | 可以增删改myisam_lock表数据 | 增删改myisam_lock表数据阻塞 |
6 | 不可以增删改查其他表数据 | 可以增删改查其他表数据 |
7 | 释放myisam_lock的写锁 | 释放写锁同时阻塞的增删改成功 |
实践结束,我觉得有必要解释一下关于表锁的特点:
- 表锁开销小,因为直接锁住整个表,不用太多查找,索引消耗的性能也比较小。
- 加锁快,因为好找所以加锁时间也短。
- 无死锁情况,因为MyISAM没有事务,所以就谈不上死锁。
- 表锁粒度大,因为锁住所有表数据,这还不大吗?
- 锁等待概率大,每次更新一下就要锁住表,所有增删改都需要排队。
- 并发数较低,增删改都是排它锁,其他线程连访问都会阻塞,并发肯定低。
- 一般用于查,因为查是共享锁,不影响其他线程读取,所以查的性能很好。
本文索引关键字:
读锁(共享锁):http://www.cnblogs.com/huanStephen/p/8067972.html#s_lock
写锁(排它锁):http://www.cnblogs.com/huanStephen/p/8067972.html#x_lock
欢迎大家索引!