MYSQL 存储引擎
MyISAM
Mysql 5.1 之前的默认存储引擎。其中提供了大量的特性,包括全文索引,压缩,空间函数等。但MyIsam 不支持事务,也不支持行锁,同时崩溃后不能安全恢复。但如果只读数据,表比较小,可以手动修复的话,它依然是一个很好的存储引擎。
MyISAM的存储会放在两个文件中,一个是数据文件,一个是索引文件。分别为.MYD和 .MYI 两个扩展。但文件受限于磁盘空间和操作系统中单个文件的最大尺度。如果想要修改表大小可以通过修改表的MAX_ROWS和 AVG_ROW_LENGTH 两个选项值,两个值相乘就是表可达到的最大大小。但是修改这两个值可能会造成表的数据失效和索引失效,可能会花费大量的时间(以Mysql 5.0 为例)。
MyISAM的特性
加锁和并发: MyISAM 会对整个表加锁,而不是对行加锁,读取时会把需要使用的所有表都加上共享锁。写入时会加排他锁。但在表有读取查询的同时,也可以对表进行插入操作(这被称为并发插入)。
修复:手动修改和检查操作。执行表的修复可能会造成表数据的丢失,而且修复过程很慢。 通过CHECK TABLE mytable 检查表错误。 PEPAIR TABLE mytable 进行修复。如果mysql 服务关闭,可以借助工具。
索引:MyISAM 支持全文索引,基于分词创建的索引。
延迟更新索引键:在创建MyISAM 表时,如果指定了DELAY_KEY_WRITE 选项。在每个修改完成时不会立即进入磁盘中,而是先进入键缓冲区,只有清理键缓冲区或者关闭表的时候才会把索引快写入磁盘中。
MyISAM 压缩表
如果创建并导入的数据不会再进行修改,那么MyISAM 的压缩表就比较适合。可以使用工具 myisampack 进行压缩。但是压缩后的表不能修改。压缩表主要减少磁盘空间占用。可以因此减少磁盘的I/O ,提高查询性能,并且压缩表也是支持索引的,但索引能用在读。
InnoDB 引擎
Mysql 为什么要选择InnoDB?
首先InnoDB 是mysql 的默认引擎,它可处理了大量短期事务,自动崩溃修复特性,使的它成为最广泛的引擎。InnoDB 在5.1 版本时,sun公司被Oracle 公司收购。InnoDB 5.5 版本时oracle公司使用InnoDB plugin 覆盖了sun 公司的旧版InnoDB 。 而新版的InnoDB 增加了一些新特性, 如排序创建索引,删除或增加索引不需要复制全表数据,新的压缩方式,增加BLOB 存储方式,以及文件管理等。而后许多公司及个人对InnoDB 进行了重要贡献,如 Google,Facebook 等。这些改动很快被oracle 移动到官方版本中,包括可测量,可配置,可扩展,等其他新特性。这些改动被集成在InnoDB 5.6 版本。
InnoDB 把数据存在表空间中,表空间是一系列的数据文件组成,Mysql 4.1 以后的版本,会把每个表的数据和索引放在单独的文件中。InnoDB 的存储格式是平台独立的,也就是说可以把这些文件拷贝到其他平台。
其他引擎
Archive 引擎
Archive 引擎只支持 insert 和select 。在mysql 5.1 之前不支持索引。而且select 会造成全表扫描,适合做日志和数据采集。Archive 引擎有自己专用的行级锁和缓冲区,所以可以实现高并发的插入,并且插入的过程中会阻塞所有的select 查询来保证一致性的读,也就是插入完成之前对其他操作不可见。Archive 引擎不是一个事务引擎,只是一个高速插入和压缩的简单引擎。
Blackhole 引擎
Blackhole 引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。但是Blackhole 引擎会记录Blackhole 表中的所有日志。可以用在复制数据到备库。
CSV 引擎
CSV 引擎可以将普通的CSV 文件作为mysql 表来处理,但是不支持索引。CSV 引擎可以在数据库运行时拷入或者拷出文件。可以辅助在mysql 文件下作为表打开,同样也能把表写入到CSV 引擎中,在其他外部程序打开。是一个很好的数据交换机制。
Federated 引擎
Federated 引擎是作为访问其他Mysql 的代理,它会创建一个到远程Mysql 服务器的链接,并将查询传输到远程服务器执行,然后提交或发送需要的数据。
Memory 引擎
Memory 引擎需要快速的访问数据,并且这些数据不会被修改,重启以后丢失也没关系就是Memory 表的特性。因为不经过磁盘I/O 直接保存在内存中,所以Memory 引擎非常快。Memory 表重启后会删除数据但不会删除表。
主要使用场景:
- 查找和映射
- 缓存
- 保存分析过程数据
同时Memory 表可以使用hash 索引。但Memory 表是表级锁,所以并发写入的时候非常慢。
Merge 引擎
Merge 引擎是由多个MyISAM合并来的虚拟表。在分区功能之前,可以用来日志和仓库应用。
NDB 引擎
Mysql 服务器,NDB 集群存储引擎,分布式,share-nothing ,容灾,高可用的组合成为MYSQL 集群。
inforbright 引擎
主要作为mysql 的数据仓库,引入列查询的概念。数据高度压缩,按照块进行排序, 每个块里都对对应一组元数据,访问该元数据时可以选择是否跳过该数据。并且有时的查询只需要这些元数据是会更快。但是不支持索引,数据量众多时索引可能也会失效,而inforbright 引擎本身使用的块排序就属于一种准索引。
ToKuDB 引擎
一种在海量数据和同等索引的情况下能胜于innoDB 引擎的索引。高性能,支持事务的引擎。(正在学习,后续再补)
引擎切换
ALTER TABLE
切换存储引擎。直接使用会执行很长时间。首先会先按行把表复制到一个新表中,同时加上读锁,会消耗很大的计算机I/O操作。同时可能会失去所有的外键。
mysql> ALTER TABLE mytable ENGINE = InnoDB;
导入导出
使用工具 mysqldump 工具进行导出,并修改表名,并且工具前会加 DROP TABLE 语句注意删除。