MySql Storage Engines
- 存储引擎的概述
- MySql服务器管理的表都有一些相似之处:比如,数据库中每一个表在数据库目录都有一个format file(.frm),这个文件存储着表定义的结构,他是由服务器创建;
- 这些表也有一些不同之处:就是可以使用不同的存储引擎去管理表.每个存储引擎都有一系列的特点.比如每一个引擎都会创建一个额外的和.frm文件相对应的磁盘文件去管理数据和索引的存储.每个存储引擎也都会有自己的特点,比如有的会使用锁去管理查询竞争,有的会提供事务而有的没有事务.这些存储引擎属性都影响着查询的性能,并发和预防死锁.
- 如何使用CREATE TABLE语句显式指定存储引擎
- 查看CREATE TABLE的语法:? CREATE TABLE;
- 指定存储引擎:CREATE TABLE t (id integer) ENGINE=engine_name;
- 查看表使用了哪种引擎:
- 查询表结构:show create table table_name \G;
- 查询表信息:show table status like ‘table_name’ \G;
- 查询表所在数据库中所有表的信息:show table status from db_name \G;
- information_schema数据库存放了数据库的架构信息,可以查询tables表获得表的信息:use information_schema;select * from tables where table_name = ‘table_name’ \G;
- 查看服务器上支持的存储引擎
- show engines;
- show variables like ‘hava%’;
- MyISAM
- 在硬盘上MyISAM引擎用三种文件管理表,这些文件都在数据目录中
- .frm文件:存储表结构的定义;
- .MYD文件:存储表行的内容;
- .MYI文件:存储表的索引;
- 在操作系统上支持链接文件的特性,可以把数据文件和索引文件存放在不同的磁盘上以减小I/O;
- 查看当前服务器指定的默认存储引擎:show variables like ‘storage_engine’;
- 通过查看CREATE TABLE的帮助(? CREATE TABLE),我们可以看到,可以通过指定DATA DIRECTORY和INDEX DIRECTORY选项来把数据文件和索引文件存放在不同的目录;
- 创建存放数据文件和索引文件的目录:mkdir -p /tmp/mysql/data /tmp/mysql/index;
- 修改文件的权限:chown -R mysql:mysql /tmp/mysql;
- 创建表,并指定数据文件和索引文件的目录:CREATE TABLE t (id INTEGER) ENGINE=MyISAM DATA DIRECTORY=’/tmp/mysql/data’ INDEX DIRECTORY=’/tmp/mysql/index’;
- 此时就会在数据文件下创建真正数据文件和索引文件的链接;
- 有没有参数可以指定缺省的目录,每次创建表都去指定太费劲了吧;??????
- 分区表指定数据文件和索引文件;???????
- MyISAM与其它引擎相比具有最灵活的AUTO_INCREMENT COLUMN功能,自动增长列;
- 创建自动增长列:create table t(id integer auto_increment primary key, name varchar(50));
- 使用自动增长列(auto_increment),此列必须是主键或者是主键中的一列;
- 插入时可以指定id列也可以不指定,如果指定的话就插入指定的值,如果不指定则插入比当前最大值大1的值,即max(id)+1;
- 获得上次插入的id值使用last_insert_id()函数:select last_insert_id();
- 设置自动增长id的初始值:alter table table_name auto_increment=n;但是如果这是的n小于max(id)则不生效;
- 为一个已存在的表增加一个自增长列:alter table table_name add column col_name integer auto_increment not null, add primary key(id);
- 不支持事务
- 查看自动提交事务的选项:show variables like ‘autocommit’;
- 修改此选项:set session autocommit=0|1;
- 因为不支持事务,所以不管此选项为何值,都不能commit和rollback;
-
MyISAM的表可以被转换成一个fast,compressed,read-only的表从而节省空间
- 使用myisampack工具:mysqlpack –help;
- 进入到数据文件目录:myisampack table_name;
- 观察发现压缩比例为90%,只剩下10%的数据量大小;对指定DATA DIRECTORY和INDEX DIRECTORY选项的表同样使用,亲测;
- 重启之后检测表(check table table_name)就会发生错误,表内数据丢失,对只读的性能支不好,如果使用的话,压缩完之后一定要备份;
-
MyISAM支持FULLTEXT索引和spatial数据类型,全文索引和空间数据类型
- 对全文索引支持不够好,可以使用instr()函数去实现;
- 也可以使用第三方的插件去实现;
- MyISAM引擎对锁的支持
- MySql管理使用MyISAM引擎的表之间的查询竞争使用表级的锁,这使得查询的性能非常快,多个查询可以同时访问一张表.对于写操作,会使用一个exclusive的表级锁去阻止其它读写操作.虽然表级锁会影响点性能,但是不会发生死锁;
- 显式的对表加锁:lock table table_name lock_type; lock tables table_name1 lock_type, table_name2 lock_type;
- 解锁:unlock tables;
- 如果在session中加write锁,则本session可以进行读写操作,其它的session对表进行读和写就需要等待锁释放;
- 如果在session中加read锁,则本session和其它session都可以进行读操作,本session无法进行写操作,其它的session对表进行读和写就需要等待锁释放;
- 如果在session中加read local锁,即只锁住加锁前一时刻的表的数据,则本session可以进行读操作(查到的只是加锁前的数据),但是不能进行写操作,其它session可以进行插入操作(查到的是所有的数据),但是删除和更新操作需要等待锁释放;
- 可以通过LOW_PRIORITY和HIGHT_PRIORITY来影响MyISAM表的内部调度机制;可以通过INSERT DELAYED先把表中数据缓存到服务端,等到表不忙的时候再插入;
- 一般情况下在OLTP系统中,更新操作优先于查询操作,因为更新操作时间比较短,查询操作时间比较长(所以一般要提升查询操作的优先级,降低更新操作的优先级);要修改查询的优先级使用:SELECT HIGH_PRIORITY * FROM t;修改更新语句的优先级使用:INSERT INTO t VALUES(1);可以使用read local锁做实验,优先级低的无法插入,优先级高可以插入;
- 数据延迟插入:INSERT DELAYED INTO t VALUES(1);可以使用write锁来模拟这种情况,不实用delayed则等待,使用就马上返回成功,但是真正插入要等表不忙的时候;当有延迟操作时会产生一个延迟进程,它是一个共用的线程,只有一个;
- 查看当前链接到服务器的进程列表:show processlist;杀掉进程:kill id;
- 与延迟插入有关的全局变量:show global variables ‘%delayed%’;
- delayed_insert_limit:延迟插入时,插入多少条数据后检查是否有查询操作,如果有查询操作,则查询操作先执行;
- delayed_insert_timeout:限制延迟操作的等待时间;
- delayed_queue_size:定义延迟线程队列的大小,以行为单位;
- 与延迟插入有关的全局状态:show global status ‘%delayed%’;
- delayed_errors:记录延迟插入错误的次数;
- delayed_insert_threads:当前有多少线程在使用延迟操作;
- delayed_writes:使用延迟线程插入的记录行数;
- 数据表的存储格式是非常的轻便的,因此可以通过直接拷贝表所在的目录到其它的主机以实现对表的备份额迁移
- 拷贝时需要注意文件的权限和拥有者,一般指定cp -a选项;
- 拷贝表时可能会有缓存,最好能在关闭服务器的情况系进行,以保证数据完整性;(岂不是保障不了高可用性了?)
- 可以指定一个MyISAM表最少存储多少条记录,这允许MyISAM表去调整表内部行指针的大小,也可以配置缺省的表内部行指针大小供服务器使用
- 在创建表时使用MAX_ROWS和MIN_ROWS选项(? CREATE TABLE),这个值只是一个参考值,实际的数据行数可以大于也可以小于这个值;
- 配置系统默认大小使用myisam_data_pointer_size选项:show variables like ‘myisam_data_pointer_size’,这个选项是当创建表时没有使用MAX_ROWS选项时使用,默认为6,不能小于2也不能大于7.它代表可以用几个字节(一个字节是8位)去寻址,指定n,表示2的8n次方,即指定为2,3,4,5,6时依次代表可以存放64K,16M,4G,1T,256T的数据;
- 把max_rows设为5,myisam_data_pointer_size范围是2~7,2个字节就足够了(2^16),所以其实就是让myisam是用2个字节的指针,并不是说最多5行.如果把max_rows设置为大于2^16的值,就要用3个字节表示,所以myisam_data_pointer_size会设为3,此时最多存放2^24行.
- 如果创建表时指定了max_rows,那么表至受限于最大的行数;如果没有max_rows,则表受限于最大大小;
- 导入数据时,可以先禁用掉索引,等到导入数据后再打开索引,这样会加快导入数据的速度.当使用LOAD DATA [LOCAL] INFILE导入数据时,它会自动的禁用和启用索引,以加快导入速度
- 查看LOAD DATA [LOCAL] INFILE的帮助:? load data; load data [local] infile file_name into table table_name;
- 与LOAD DATA INFILE相对应的是SELECT … INTO OUTFILE,把表中的数据导入到文件中;
- 语法:select * from t into outfile ‘/tmp/t.txt’ fields terminated by ‘,’ enclosed by ‘”‘; 字段以[“]包围,字段之间以[,]号分割,默认每行之间以换行分割;
- 语法:load data infile ‘/tmp/t.txt’ into table t fields terminated by ‘,’ enclosed by ‘”‘;
- 向MyISAM表中添加数据时,如果磁盘空间不足时服务器会挂起操作,直到空间变为可用状态,然后继续完成操作;
- MyISAM表的行存储格式
- 查看表使用哪种行存储格式:与查看表使用引擎的方式一样,表信息的Row_format字段.
- 表中包含有可变长度的列,则表就是Dynamic的;
- 表中没有包含可变长度的列,表就是Fixed的;
- 固定行存储格式:
- 所有的行有固定的大小;
- 行存储的位置是在行长度的整数倍的位置,方便查找;
- 占用更多的存储空间;
- 动态行存储格式:
- 行占用动态的长度;
- 查看起来不是很高效;
- 节省空间;
- 更容易产生碎片;
- 压缩行存储格式:
- 表被压缩以节省空间;
- 优化的存储以加快检索;
- 表是只读的;
- 做实验时可以使用hexdump工具,查看数据文件中实际存放的数据,可以加上-C选项;
- 手动像数据表文件中添加数据后不可用,需要经历check table table_name; optimize table table_name; repair table table_name;三个过程,应该是在information_schema库中写入统计信息;
- 查看表使用哪种行存储格式:与查看表使用引擎的方式一样,表信息的Row_format字段.
- 在硬盘上MyISAM引擎用三种文件管理表,这些文件都在数据目录中
- InnoDB
- 每一个InnoDB的表在磁盘的数据目录下都有一个.frm文件和存储数据和索引的表空间,InnoDB的表空间是一个逻辑的单存储区域,这个区域由一个或者多个文件组成,还可以使用裸分区.缺省情况下,一个InnoDB的表空间存放所有的InnoDB的表的内容,这种表空间的存储是与机器无关的,根据此特性,我们可以把InnoDB表空间拷贝到其它机器上完成备份和迁移.单个表的最大尺寸可以达到操作系统支持的最大大小.同样可以配置InnoDB使得每个表使用单独的表空间(innodb_file_per_table);
- InnoDB引擎的操作需要主要需要两块磁盘资源,一个表空间用来存放数据和索引,一系列的日志文件用来记录当前活动的日志;
- 每个InnoDB表都有一个.frm文件,这一点与其它的存储引擎相同.然而不同的是,InnoDB存储数据和索引在共享表空间,这是一个或者多个单独的逻辑存储区域,所有的InnoDB表都存储在一个表空间中.这个表空间也包含一个rollback节,事务修改记录的信息和undo日志信息都存储在这个节中,这些信息用于回复失败的事务;
- 在共享表空间的文件可以设置为自动增长,因为共享表空间保存着所有数据库中所有的InnoDB表,所以共享表空间文件默认存放在服务器的数据目录下,而不是某一个数据库目录下;
- 如果不想使用共享表空间存储表的内容,可以打开innodb_file_per_table选项,这样,对于每一个InnoDB表都会生成一个.idb的文件存放数据和索引和一个.frm文件保存表结构.但是共享表空间仍然是必须的,因为它要保存InnoDB的数据字典和rollback节.使用此选项不影响以前创建在共享表空间中的表;
- InnoDB引擎支持事务,可以使用commit和rollback,它遵循ACID机制,由于多版本控制(Multi-versioning),每个事务之间是互补影响的;
- ACID
- Atomic:整个事务事务中的所有的操作要不全都成功,要不全都取消;
- Consistent:在事务开始之前和事务结束以后,数据的完整性约束没有被破坏;
- Isolated:两个事务的执行是互不干扰的;
- Durable:事务完成以后,该事务对数据库所有的操作便持久的保存在数据库中,不会被回滚;
- 事务模型
- 显式的关闭自动提交功能:set autocommit=0;
- 开启一个事务:start transaction;
- ACID
- 当MySql服务器或者主机crash之后,InnoDB提供了自动回复机制;
- MySql管理InnoDB的查询竞争使用多版本控制和行级锁,多版本控制是的每个事务都有一个单独是数据库界面;而行级锁使得查询竞争减小到最小,这使得多查询写入的时候效率最高,但是会导致死锁;
- InnoDB支持外键和引用完整性,包括级联删除和更新;
- 使用外键的两个表都必须是InnoDB的表,而且不能是临时表;
- 在父表中,被引用的列必须是键.在字表中作为外键的列必须是索引或者是组合索引的第一个,如果他不存在,在创建索引的时候会自动被创建;
- 使用外键的列不支持索引前缀;
- 如果使用CONSTRAINT子句时,要保证对象名是全局唯一的;
- 查看索引:show index from table_name \G;
- 数据表的存储格式是非常的轻便的,因此可以通过直接拷贝表所在的目录到其它的主机以实现对表的备份额迁移;
- 配置一个InnoDB表空间
- 它包含一个或者多个文件;
- 表空间中的内个组件可以是一个一般的文件或者是裸设备,或者是两种文件都有;
- 表空间文件可以在不同的文件系统或者是物理磁盘上.这样使用的一个原因是使用分布式系统;
- 表空间的大小可以超过文件系统支持的最大文件大小,主要是有两个原因
- 表空间由一个或者多个文件组成,因此大于一个单独的文件;
- 表空间可以包含裸设备,它不受限于文件系统的大小,可以使用裸设备的所有的extent;
- 表空间的最后一个文件可以自动增长,也可以定义文件的增长大小;
- 指定配置文件中的innodb_data_file_path参数(通过show variables like ‘innodb_data_file_path’);
- 默认路径下指定:[innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend]两个文件之间用[;]分割,最后一个文件可以指定自动增长;
- 指定InnoDB的路径:innodb_data_home_dir指示数据文件的路径,缺省是在数据目录下面,innodb_log_group_home_dir指示日志文件的路径;
- 配置InnoDB的缓冲区:InnoDB使用一个缓冲池去存放经常读取的物理表的信息,目的是为了减小IO,缓冲池越大越好.可以使用innodb_buffer_pool_size参数改变缓冲池的大小.
- innodb_buffer_pool_size:定义了在内存中缓存表和索引的大小,这个值越大,访问硬盘的IO越小.在一个专用的数据库服务器中,你可以设置它的大小为物理内存的80%,当然也不能设置的过大,否则就会使用到交换分区;
- innodb_additional_mem_pool_size:表示存放数据字典和其它数据表结构的信息的大小.表越多,这个空间分配的要越大.如果这个空间大小不够的话,就会从操作系统申请空间,并在error log中记录警告信息;
- innodb_max_dirty_pages_pct:配置dirty page的百分比,默认为75,当脏数据超过这个值的时候,进程就会把这些页从缓冲池写入到硬盘上;
- 查看innodb的状态变量show golbal status like ‘innodb_%’;innodb_page_size:是每一页的大小,一般为16k;Innodb_buffer_pool_pages_total:是一共有的页数;
- 每一个InnoDB的表在磁盘的数据目录下都有一个.frm文件和存储数据和索引的表空间,InnoDB的表空间是一个逻辑的单存储区域,这个区域由一个或者多个文件组成,还可以使用裸分区.缺省情况下,一个InnoDB的表空间存放所有的InnoDB的表的内容,这种表空间的存储是与机器无关的,根据此特性,我们可以把InnoDB表空间拷贝到其它机器上完成备份和迁移.单个表的最大尺寸可以达到操作系统支持的最大大小.同样可以配置InnoDB使得每个表使用单独的表空间(innodb_file_per_table);
- Merge
- MERGE表是一组MyISAM表的集合,每一个MERGE表在磁盘上都有2个文件,一个是.frm文件和一个包含组成MERGGE表的MyISAM表的名称的.MRG文件.这两个文件都存放在数据库目录下;
- 当对一个MERGE表操作时,相当于对组成MERGE表的所有的MyISAM表的操作;
- 一个MERGE表可以突破MyISAM表的最大大小的限制;
- MYSQL管理MERGE表的查询竞争使用表级锁,即锁住组成它的MyISAM表,所以不会产生死锁;
- 一个MERGE表是很轻便的,因为.MRG文件是一个文本文件;
- 可以进行增删改查操作,在插入操作时可以指定是往哪个表中插入数据;
- 当MERGE引擎要锁住一个MERGE表时,就会对组成它的所有MyISAM表加锁;
- 对MERGE表执行SEELCT操作时,对底层的表加read lock;
- 对MERGE表执行更新操作(delete, update)时,对底层的表加write lock;
- 对MERGE表的操作:
- 创建MyISAM表m1:create table m1(id int, name varchar(10)) engine=myisam;
- 创建MyISAM表m2:create table m2(id int, name varchar(10)) engine=myisam;
- 创建MERGE表:create table m(id int, name varchar(10)) engine=merge union=(m1, m2);
- 插入数据:insert into m1 values(1, ‘a’);insert into m1 values(1, ‘a’);
- 查询:select * from m;
- 创建MyISAM表m3:create table m3(id int, name varchar(10)) engine=myisam;
- 加入merge表:alter table m union=(m1, m2, m3);很灵活,可以互相组合;
- 修改表使得merge表可以插入数据,create table m(id int, name varchar(10)) engine=merge union=(m1, m2) insert_method=last;method_method=0:不允许插入;first:插入到union中的第一个表;last:插入到union中最后一个表;
- 可以通过直接修改.MRG文件来修改MERGE表,修改后使用flush tables;来刷新表缓存;
- Memory
- MEMORY表的.frm文件在数据库目录下,数据和索引都存储在内存中;
- 对MEMORY表的操作性能都很高;
- 在服务器重启之后,MEMORY表中的数据就不存在了,但是他的表结构还是存在的;
- 因为MEMORY表使用的是内存,所以不适用于大表;
- MEMORY表使用表级锁来处理查询竞争,所以不会发生死锁;
- MEMORY表不支持TEXT和BLOB类型;
- 它支持两种索引:HASH和BTREE
- 缺省使用HASH索引,这种索引算法使用唯一索引会非常高效,然而HASH索引只能用于比较运算符(=, <>);
- BTREE索引算法更适合于范围查找,例如>,<或者between;
- 可以使用创建表时的max_rows和服务器参数max_heap_table_size来限制MEMORY表的大小;
- 设置索引:
- hash:alter table table_name add index idx_name using hash(col_name);
- btree:alter table table_name add index idx_name using btree(col_name);
- 当不需要MEMORY表的内容时,要释放被MEMORY表使用的内存,使用DELETE FROM, TRUNCATE TABLE或者删除整个表DROP TABLE;
- Federated
- 它访问的是在远程数据库表中的数据,而不是本地的表,仅在-MAX版的MySql可用;
- 如果要使用需要在在configure时添加–with-federated-storage-engine选项;
- 创建一个FEDERATED表时,服务器在数据库目录创建一个.frm文件,没有表数据文件,因为实际数据在远程数据库上;
- 操作表的内容时需要MYSQL客户端API,读取数据通过SELECT * FROM table_name来初始化,然后通过mysql_fetch_row()的c函数去一行行读取;
- 创建一个FEDERATED表
- 假设在远程服务器上有一个表为tbl;
- 在本地创建表:create table federated_tbl(id int, name varchar(10)) engine=federated connection=’mysql://root@remote_host:3306/federated/tbl’;
- 其他CONNECTION的格式:
- CONNECTION=’mysql://username:password@hostname:port/database/tablename’;
- CONNECTION=’mysql://username@hostname/database/tablename’;
- CONNECTION=’mysql://username:password@hostname/database/tablename’;
- 局限性
- 远程服务器必须是一个MYSQL服务器;
- 不支持事务;
- 支持增删改查的操作和索引,但是不支持ALTER TABLE和DROP TABLE;
- 用途:可以跨服务器访问,不用创建DB LINK了;
- BDB
- 需要下载包含BDB版本的MYSQL(MySql-Max分发版支持BDB);
- 安装时在configure加入–with-berkeley-db选项;
- BDB启动选项
- –bdb-home:指定BDB表的基础目录,应该和–datadir相同;
- –bdb-lock-detect:BDB锁定检测方式,DEFAULT,OLDEST,RANDOM,YOUNGEST;
- –bdb-logdir=path:BDB日志文件目录;
- –bdb-no-recover:不在恢复模式启动Berkeley DB;
- –bdb-no-sync:不同步刷新BDB日志,使用–skip-sync-bdb-logs代替;
- –bdb-shared-data:以多处理模式启动Berkeley DB(初始化Berkeley DB之时,不要使用DB_PRIVATE);
- –bdb-tmpdir=path:BDB临时文件目录;
- –skip-bdb:禁止BDB存储引擎;
- –sync-bdb-logs:同步刷新BDB日志.这个选项默认被允许,请使用–skip-sync-bdb-logs来禁止它;
- 创建一个BDB表会有两个文件,一个是.frm文件,一个是存放表数据和索引的.db文件;
- 支持事务;
- 每一个BDB表都需要一个primary key,如果创建时不指定则会隐式创建一个;
- SELECT COUNT(*) FROM tbl_name对BDB表很慢,因为在该表中没有行计数被维持;
- 使用页面级别的锁;
- 使用mysql客户端是,应该使用–no-auto-rehash选项;
- BDB表的限制
- 每个BDB表在.db文件里存储文件被创建之时到该文件的路径,这个被做来允许在支持symlinks的多用户环境里检测锁定.因此,从一个数据库目录往另一个目录移动BDB表是不能的;
- 当制作BDB表的备份之时,你必须使用mysqldump要么做一个包含对每个BDB表的文件(.frm和.db文件)及BDB日志文件的备份.BDB存储引擎在它的日志文件存储未完成的事务以及要求它们在mysqld启动的时候被呈出来.BDB日志在数据目录里,具有log.XXXXXXXXXX(10位数字)形式名字的文件;
- 如果允许NULL值的列有唯一的索引,只有单个NULL值是被允许的,这不同于其它存储引擎;
- EXAMPLE
- EXAMPLE引擎是一个不做适合事情的存储引擎,主要用于MySql源码中一个例子用来演示如何开始编写一个新的存储引擎;
- 需要在configure时添加–with-example-storage-engine选项;
- EXAMPLE引擎不支持编译索引;
- Archive
- ARCHIVE引擎被用来以非常小的空间存储大量无索引数据;
- 要使用此引擎需要在configure时添加–with-archive-storage-engine选项;可以通过show variables like ‘have_archive’查看;
- 创建一个ARCHIVE表会有一个保存表结构的.frm文件,保存数据和元数据的.ARZ和.ARM文件,如果有优化操作的话还有一个.ARN文件;
- ARCHIVE引擎仅仅支持SELECT和INSERT操作,以除了几何数据类型外的所有数据类型;
- 存储:当inesrt数据时,archive引擎使用zlib无损数据压缩的方式压缩,optimize table可以分析表,并打包为更小的格式;
- 查询:在查询数据时,记录根据需要被加压缩,没有行缓存.SELECT操作执行完全表格扫描,当一个SELECT发生时,它找出当前有多少行可用,并读取行的数量;
- CSV
- CSV引擎使用逗号分隔值格式的文本文件存储数据(eg:[“1″,”aaa”]);
- 要想使用此引擎在configure时使用–with-csv-storage-engine选项;
- CSV引擎不支持null值,所以在创建时应加上not null选项;
- CSV引擎不支持索引;
- 创建CSV表会在数据库目录创建一个.frm文件,一个.CSV的文本文件用来存储数据和一个.CSM文件;
- Blackhole
- BLACKHOLE引擎就像黑洞一样,它接收数据但是是丢弃它而不是存储它,查询时总返回NULL;
- 创建BLACKHOLE引擎后会在数据库目录创建一个.frm文件,没有其它文件与之关联;
- 它支持所有的索引;
- 要想使用此引擎在configure时使用–with-blackhole-storage-engine选项;
- 用途:
- BLACKHOLE表不记录任何数据,如果二进制日志被允许,SQL语句被写入日志,可以用作重复器或者过滤器机制;
- 转储文件语法的验证;
- 来自二进制记录的开销测量,通过比较允许二进制日志功能的BLACKHOLE的性能与禁止二进制功能的BLACKHOLE的性能;
- 因为BLACKHOLE本质是一个no-op存储引擎,可以用来查找与引擎自身不相关的性能瓶颈;