第7章 选择对象的存储引擎
常见的引擎有:
MyISAM, Innodb, NDBCluster, Memory , Archive, Merge, federated
MyISAM存储引擎
MyISAM 引擎的前身是ISAM存储引擎, 实际上那会还没有存储概念, ISAM也只是种算法, 或者说数据的处理方式。 5.5之前 mysql默认的存储引擎是MyISAM, 5.5后默认的存储引擎是InnoDB
创建一个存储引擎是 MyISAM
CREATE TABLE yang.t_myd2 (id int) ENGINE=myisam;
对于创建后, 在物理层面, 每个MyISAM表对象都是由3个独立的操作系统文件组成, 文件名与表对象名相同, 文件的扩张名有下面3个类型(注意大小写)
.frm: 对象结构定义文件, 用于存储表对象的结构
.MYD: 数据文件, 用于存储表数据
.MYI: 索引文件, 用于存储表的所以信息
7.4 InnoDB 存储引擎
mysql5.5 版本之后, InnoDB是默认存储引擎
1)设计遵循ACID模型, 支持事务, 拥有从服务崩溃中恢复的能力,能够最大限度地保护用户的数据。
ACID: 原子性 一致性 隔离性 持久性
2)支持行级锁, 并引入类似Oracle数据库中的一致性读特性, 以提升多用户并发时的读写性能
3)InnoDB 引擎表组织数据时,按照主键(primary keys)聚簇,通过主键查找数据时性能极为优异
4)在维护数据完整性方面, InnoDB 支持外键(foreign-key)约束
5)InnoDB 拥有自己独立的缓存池(对应 innodb_buffer_pool_size 系统变量, 类似Oracle 数据库中的SGA_TARGET),常用数据(含索引)都在缓存中
6)对于insert update delete 操作, 会被一种为change buffering的机制自动优化,InnoDB不仅提供了一致性读,而且还能缓存变更数据, 减少磁盘I/
CREATE TABLE yang.test3 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
v1 VARCHAR(20)
) ENGINE = INNODB AUTO_INCREMENT=1
DEFAULT CHARACTER SET UTF8MB4
COLLATE UTF8MB4_GENERAL_CI;
InnoDB特性
1)所有的表都要创建主键, 最好选择常作为查询条件的列, 如果没有合适的列,那么就创建在auto_increment 列上
2)如果数据是通过多表关联获取, 那么使用join, 为提高join性能, 最好在join列上创建索引, 并且join条件的这些列最好使用相同的数据类型和定义
3)综合考虑磁盘的I/O能力, 必要时可以禁用autocommit自动提交功能
4)相互关联的DML操作放在同一个事务中处理
5)停止使用lock table 语句, innodb 能够处理多回话并发读写同一个表对象,如果是希望执行拍它记录更新, 那么可以尝试使用 select .. for update 语句
6)启动innodb_file_per_table 选项, 以使表中数据和索引保存在单独的文件中, 而不能保存到系统表空间(system tablespace)
7)评估数据和读写行为是否使用与新的压缩(compression)特性, 如果可以,建议执行 create table时指定 row_format=compressed选项,提高读写性能
8)启动mysql服务时附加 -sql_mode=NO_engine_substitution, 防止表被创建成其他存储索引
9)在新版中, 删除或创建索引性能有所提升,对系统的冲击也有所降低
10)清空(truncate)表, 现在非常快 ,并释放的空间能够被操作系统重用
11)使用DYNAMIC格式保存大数据类型(如BLOB或TEXT) 将更加有效率
12)在INFORMATION_SCHEMA 库中提供了若干新的表对象, 可用于监控存储引擎的工作和负载情况
13)新增performance_schema库 可以用来查看存储引擎的性能统计数据