MyISAM 是 MySQL 默认存储引擎, 它不支持事务, 外键. 但访问速度快, 对事务完整性没有要求或者以 select,insert 为主的应用基本上都可以使用这个引擎.
每个 MyISAM 在磁盘上存储成 3 个文件, 文件名都和表名相同, 扩展分别是:
- frm(存储表定义)
- MYD(MYdata 存储数据)
- MYI( MYIndex 存储索引)
数据文件和索引文件可以放置在不同的目录, 平均分布 IO, 获取更快速度.
1. 指定索引文件和数据文件的路径
在创建表的时候通过 data directory 和 index directory 语句指定, 也就是不同 MyISAM 表的索引文件和数据文件可以放置到不同的路径下, 文件路径需要是绝对路径, 并且有访问权限
-- 默认存储路径
SELECT @@datadir;
-- 首先要创建 / ibddir 目录, 有 5.6 才支持单表指定目录
- CREATE TABLE test_dir_table(
- strative_id VARCHAR(16) NOT NULL,
- date_id VARCHAR(8) NOT NULL
- PRIMARY KEY (strative_id)
- ) ENGINE=MYISAM DATA DIRECTORY = '/ibddir' INDEX DIRECTORY= '/ibddir';
2. 检查表的健康状态
表可能会损坏, 原因多种多样, check table 对 MYISAM 和 InnoDB 表都有作用, 如检查有异常使用 (repair table 表名;) 来修复.
语法:
- CHECK TABLE tbl_name[,tbl_name] ... [option] ...
- option= {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
- CHECK TABLE ai;
3. MYISAM 表 3 种不同的存储格式
3.1 静态 (固定长度) 表, 动态表, 压缩表. 其中静态表是默认的存储格式, 字段都是非变长字段, 每个记录都是固定长度. 这种存储方式的优点是存储非常迅速, 容易缓存, 出现故障容易恢复, 缺点是空间占用多, 存储时会按照宽度定义补足空格, 但应用访问时并不会得到这些空格.
但有个注意是: 如果保存的内容后面本来就带有空格, 在应用访问时也会被自动去掉, 从而丢失了尾部空格 .
- CREATE TABLE Myisam_char (NAME CHAR(10)) ENGINE=MYISAM;
- INSERT INTO Myisam_char VALUES('abcde'),('abcde'),('abcde'),('abcde');
- SELECT NAME,LENGTH(NAME) FROM Myisam_char;
从下面的输出看出, 前面空格保留了.
3.2 动态表中包含变长字段, 记录不是固定长度的, 优势是占用的空间相对比较小, 但频繁的更新删除记录会产生碎片, 需要定期 optimize table 或 myisamchk -r 命令, 出现故障时恢复相对比较困难.
3.3 压缩表由 myisampack 工具创建, 占据非常小的磁盘空间, 每个记录是被单独压缩的.
4. 最后在回顾下 myisam 支持的特性
存储限制: "有", 官方是 256TB
锁机制 : "表锁" 适用于并发性低的场景
B 树索引 : "支持"
全文索引 :"支持"
索引缓存 :"支持"
数据压缩 :"支持"
空间使用 :"低" 默认是静态存储空格
内存使用 :"低" 因为不支持数据缓存
批理插入的速度: "高" 因为不支持支持事务, 不需要写入日志文件
来源: http://www.linuxidc.com/Linux/2018-09/154351.htm