概述
mysql5.5.8之前的默认的表存储引擎,之后默认是innodb存储引擎。
- MyISAM为速度而设计,和SELECT搭配起来使用更好
- 不支持事务
- 如果表的数据偏向静态,即表中的数据不经常更新/删除,大多仅仅是查询操作,那么使用MyISAM是最好的选择
- 支持全文检索,支持text支持前缀索引
- 支持数据压缩,可以存储更多的数据
- 紧密存储,顺序读性能很好
- 表级锁,写的时候会锁表,并发性差
- 缓冲池只缓存(cace)索引文件,而不缓冲数据文件,这点和大多数的数据库都非常不同
表锁
myisam存储引擎是表锁
表读锁
如果希望一张表只读,不可修改,这个时候可以加表读锁。表读锁不会出现死锁的情况,因为一张表加了读锁,这张表就不能获取到排它锁,读锁是乐观锁(觉得一般会没有问题,如果有问题,等发现问题的时候再说)
( 加锁会话)先锁定表:lock table storage read;
( 加锁会话)查看是否可以修改数据:update storage set amount = amount + 1 WHERE id = 1;修改失败,不可以修改数据
( 其它会话)可以获得表读锁:lock table storage read;
( 其它会话)阻塞表写锁:lock table storage write;
( 其它会话)可以获得共享锁:select * FROM storage WHERE id = 1 LOCK in SHARE MODE;
( 其它会话)阻塞排它锁:select * FROM storage WHERE id = 1 for update;
( 加锁会话)释放表锁:unlock tables;
表写锁
并发的时候,如果想在修改数据之前锁住表的话,可以加表写锁,加了锁之后,别的会话连查询都不能查询,不会出现死锁,写锁是悲观锁(总是觉会出问题,所以干脆自己用这个条数据的时候,别人还是等我用完再说)
(加锁会话)先锁定表:lock table storage write;
(其它会话)读取:select * from storage,会阻塞等待
(其它会话)的其它锁测试与表读锁一样
(加锁会话)释放表锁:unlock tables;,这个时候其它会话就可以查询到数据了
数据存储
在数据目录下:数据目录/数据库名称的文件夹下/
有三个文件
- 表名.frm,表的定义文件
- 表名.MYD,表的数据文件
- 表名.MYI,表的数据文件
MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可以通过使用myisampack工具来进一步压缩数据文件,因为myisampack工具使用赫夫曼(Huffman)编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读的,当然用户也可以通过myisampack来解压数据文件。
在MySQL5.0版本之前,MyISAM默认支持的表大小为4GB,如果需要支持大于4GB的MyISAM表时,则需要制定MAX_ROWS和AVG_ROW_LENGTH属性。从MySQL5.0版本开始,MyISAM默认支持256TB的单表数据,这足够满足一般应用需求。
此外,在MySQL5.1.23版本之前,无论是在32位还是64位操作系统环境下,缓存索引的缓冲区最大只能设置为4GB。在之后的版本中,64位系统可以支持大于4GB的索引缓冲区。
应用场景
- 非事务应用,例如保存日志,不会被回滚回去
- 只读类应用,报表数据,字典数据,很少写
- 空间类应用,开发GIS系统,5.7版本以前只有myisam才支持空间类函数
- sql查询,分组查询时候,系统创建的临时表就是myisam引擎