mysql 存储引擎
- 建表时候,会在
mytable.frm
中定义表定义。 - 表的定义是在服务层。
- 不同系统存储形式不一样(数据和索引)。
使用show table status
命令 显示表的相关信息,例如 show table status like 'user' \G
,mysql5.1中的innodb plugin
支持一些新特性(BLOB存储方式使用),mysql5.1一定要使用 innodb plugin ,比 旧innodb要好得多
mysql 5.5 之后 innodb plugin 才替换掉旧的 Innodb
Innodb 概览
mysql4.1 之后新特性
- innodb 可以将每个表的数据和索引放在单独文件当中
- innodb 可以将裸设备作为存储介质
Innodb 特点
- 使用mvcc 支持高并发
- 实现了四个标准隔离级别(默认级别为 REPEATABLE READ(可重复读))。
- 使用间隙锁(next-key locking) 策略防止幻读的出现。
- 间隙锁不仅锁定查询行,还对索引进行锁定。
- INNODB 基于 聚簇索引 建立。
- 存储格式是平台独立的,意味着可以跨平台使用。
- 内部进行优化,可预测性预读,可以自动在内存当中创建hash索引加速读操作自适应哈希索引,加速操作的加入缓冲区。
- 阅读官方文档"InnoDB 事务模型和锁"了解更多内容。
- innodb 通过一些机制和工具实现真正的热备份。
聚簇索引 对于主键查询有非常高的性能,不过二级索引中必须包含主键列,如果主键列很大,其他所有索引都会很大,
Myisam 存储引擎
mysql5.1 之前默认使用 MyISAM 作为存储引擎
特点:
- 全文索引,压缩,空间函数
- 不支持事务和行级锁
- 崩溃之后无法安全恢复
存储:
将表存储在两个文件当中
- 数据文件 ( .MYD )
- 索引文件 ( .MYI )
- 表支持包含动态或者静态(长度固定)行,mysql根据表定义决定存储形式
- Mysql5 当中,如果是变长行,只能处理256TB 数据
- 修改Myisam 表指针长度, 修改表 max_rows 和 avg_row_length 选项实现
myisam特性
- 加锁与并发:对整张表加锁,而不是针对行。
- myisam 表, mysql 可以手工或者自动检查和修复操作(但是效率较低)。
- 索引特性:即使是BLOB 和 TEXT等长字段,也可以基于500 个字符创建。
- myisam 支持全文索引,基于分词创建索引。
- 延迟更新索引键。
myisam 压缩表
如果表中数据不再修改,可以使用myisam 压缩表,作用是减少磁盘i/o, 提高查询性能。
myisam 性能问题
最典型的性能问题是 表锁 的问题
mysql 内建其他存储引擎
Archive 引擎
- 只支持 insert 和 sleect, mysql5.1 之前不支持索引。
- 适合日志和数据采集类应用。
- 支持行级锁和专用缓冲区,实现高并发插入。
- 不是事务性引擎,只对告诉插入和压缩做了优化的简单引擎。
Blackhole 引擎
- 无存储,丢弃所有插入数据。但是服务器会记录blackhole 表的日志。
- 简单的日志引擎。
CVS 引擎
- 将普通cvs 作为mysql 表处理,不支持索引。
- cvs 引擎可以作为 数据交换的机制(excel 表格的转换)。
Federated 引擎
- 访问其他mysql 服务器代理,但是默认是禁用的。
Memory引擎
- 可以快速访问数据 使用 Memory 表。
- 所有数据都是在内存当中。
- 每行长度固定。
- 并发性能较低。
- 作用:
- 查找或者映射表。
- 缓存周期性聚合数据。
- 保存数据产生的中间数据。
- 如果mysql 查询使用临时表保存结果,你们内部使用就是Memory 表,但是如果数据量较大,就会转为myisam 表
Merga 引擎
- myisam 引擎变种,多个myisam 表合并变种
- 分区功能实现后,被放弃
- NDB 集群引擎
- 用于mysql 集群
第三方存储引擎
OLTP 类引擎
- XtraDB引擎
- PBXT引擎
- TokuDB 引擎
如何选择引擎
除非使用到了innodb 不具备的特性,并且无法替代,否则优先选择innodb
主要看待四点
- 事务
- 备份
- 崩溃恢复
- 特有特性
个人看法:
- 对于极高的插入数据要求时候,可以使用myisam 或者archieve
- 如果不知道其他引擎的特性还是建议INNODB
测试崩溃数据恢复问题就是模拟电源断电!!!
数据表引擎转换
1. 直接转换
mysql> ALTER TABLE mytable ENGINE = InnoDB
这种方式性能很低,而且会加锁
2. 使用导入导出的方法
导入与导出:使用msyql 工具导出sql 语句然后手动修改引擎
3. 创建与查询
mysql > create table innodb_table like myisam table; mysql > alter table innodb_table engine = InnoDB; mysql > insert into innodb_table select * from myisam_table
4. 数据量很大的话可以分批处理
start transaction; insert into innodb_table select * from myisam_table where id between x and y; insert into innodb_table select * from myisam_table where id between x and y; insert into innodb_table select * from myisam_table where id between x and y; ....... commit
总结
第一篇读书笔记主要介绍了和MYSQL的存储引擎的重点内容,以及简单介绍MYSQL 的事务相关内容,在前言也说过,内容比较基础并且由于以前偷懒很多都是截图书上的内容=-=。