初识MariaDB存储引擎

摘要:
在看MariaDB的存储引擎之前,可以先了解MySQL存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。MyISAM表存储为三个文件:.frm文件存储表定义。索引文件的扩展名是.MYIInnoDB存储引擎:提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。非常适合分布式应用CSV:逻辑上由逗号分割数据的存储引擎。CSV存储引擎不支持索引。

在看MariaDB的存储引擎之前,可以先了解MySQL存储引擎。

MySQL常用的存储引擎:

  • MyISAM存储引擎:是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。

MyISAM表还支持3中不同的存储格式:

1 静态表
2 动态表
3 压缩表

静态表是默认的存储格式,静态表中的字段都是非变长的字段,优点是:存储非常迅速,容易缓存,出现故障容易恢复;缺点是:占用的空间通常比动态表多。(注意: 在存储时,列的宽度不足时,用空格补足,当时在访问的时候并不会得到这些空格)
动态表的字段是变长的,优点是:占用的空间相对较少,但是频繁地更新删除记录会产生碎片,需要定期改善性能,并且出现故障的时候恢复相对比较困难。
压缩表占用磁盘空间小,每个记录是被单独压缩的,所以只有非常小的访问开支。

MyISAM表存储为三个文件:.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)

  • InnoDB存储引擎:提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
  • MEMORY(heap)存储引擎:memory实际是heap的替代品。使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件(只包含表定义)。
    • 优点:MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引
    • 缺点:一旦服务关闭,表中的数据就会丢失掉。其只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型.存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存
    • 关于该存储引擎的浅析:http://www.jb51.net/article/29039.htm
  • MERGE存储引擎:是一组MyISAM表的组合,这些MyISAM表必须结构完全相同。MERGE表本身没有数据,类似于一个视图.对MERGE类型的表进行查询、更新、删除的操作,就是对内部的MyISAM表进行的。似乎看到分区表的影子,但完全是两种不同的东西.

官网说明:https://www.mariadb.com/kb/en/merge/

  • archive存储引擎:这种类型只支持select 和 insert语句,而且不支持索引。非常适合存储大量的独立的作为历史记录的数据。Archive拥有高效的插入速度,但其对查询的支持相对较差常,应用于日志记录和聚合分析方面。
  • Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
  • CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
  • BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继

MYSQL 中的部分存储引擎的特性:

Attribute

MyISAM

Heap

BDB

InnoDB

Transactions(支持事务)

No

No

Yes

Yes

Lock granularity(锁粒度)

Table

Table

Page (8 KB)

Row

Storage(存储)

Split files

In-memory

Single file per table

Tablespace(s)

Isolation levels(隔离级别)

None

None

Read committed

All

Portable format(可移植性)

Yes

N/A

No

Yes

Referential integrity(参照完整性,似乎是对外键的支持)

No

No

No

Yes

Primary key with data

No

No

Yes

Yes

MySQLcaches data records

No

Yes

Yes

Yes

Availability(支持的版本)

All versions

All versions

MySQL-Max

All Versions


MariaDB与 MySQL 相比较

MariaDB 提供以下特性:

  • XtraDB 替换 InnoDB,XtraDB 是 Percona 开发维护的 InnoDB 威力加强版,整合 Google、Facebook 等公司和 MySQL 社区的补丁。
  • Aria 存储引擎和 Sphinx 存储引擎
  • 基于 Gelera Cluster 的 MariaDB 集群方案
  • 多主复制(将在 MariaDB 10.0 实现,由淘宝贡献)
  • Cassandra 存储引擎(将在 MariaDB 10.0 实现)

,MariaDB 更强的地方在于:

  • Aria(原名Maria) 存储引擎

Aria 存储引擎是默认被编译进MariaDB 5.1里的,并且在mysqld启动的时候就要求同时启动.

另外,内部的磁盘表是Aria表格式而不是MyISAM表格式.这将使某些GROUP BYDISTINCT请求速度更快,因为Aria有比MyISAM更好的缓冲机制.包含Aria是MariaDB 5.1和MySQL 5.1之间的一个不同.

There are also some new options toCREATE TABLE:

    • TRANSACTIONAL= 0 | 1:Transactional means crash-safe for Aria
    • PAGE_CHECKSUM= 0 | 1:If index and data should use page checksums for extra safety.
    • TABLE_CHECKSUM= 0 | 1:Same asCHECKSUMin MySQL 5.1
    • ROW_FORMAT=PAGE:The new cacheable row format for Aria tables. Default row format for Aria tables and only row format that can be used ifTRANSACTIONAL=1. To emulate MyISAM, useROW_FORMAT=FIXEDorROW_FORMAT=DYNAMIC
    • CHECKSUM TABLEnow ignores values in NULL fields. This makesCHECKSUM TABLEfaster and fixes some cases where same table definition could give different checksum values depending on row format. The disadvantage is that the value is now different compared to other MySQL installations. The new checksum calculation is fixed for all table engines that uses the default way to calculate and MyISAM which does the calculation internally. Note: Old MyISAM tables with internal checksum will return the same checksum as before. To fix them to calculate according to new rules you have to do anALTER TABLE. You can use the old ways to calculate checksums by using the option--oldto mysqld or set the system variable '@@old' to1when you doCHECKSUM TABLE ... EXTENDED;
    • At startup Aria will check the Aria logs and automatically recover the tables from last checkpoint if mysqld was not taken down correctly.
  • PBXT 存储引擎

PBXT是 MariaDB 附带的一种存储引擎,PBXT 在 MariaDB 的 5.1/5.2/5.3 版本中存在,但从 MariaDB 5.5 开始就不再提供 PBXT 存储引擎,而且以后也将不再提供。

原因是PBXT 已经不再继续开发了,当然,在 MariaDB 的源码发行中还将包含它的源码,但你需要自行构建才能使用。

Percona XtraDB 是 InnoDB 存储引擎的增强版,被设计用来更好的使用更新计算机硬件系统的性能,同时还包含有一些在高性能环境下的新特性。

XtraDB 存储引擎是完全的向下兼容,在 MariaDB 中,XtraDB 存储引擎被标识为"ENGINE=InnoDB",这个与 InnoDB 是一样的,所以你可以直接用XtraDB 替换掉 InnoDB 而不会产生任何问题。

Percona XtraDB 包含有所有 InnoDB's 健壮性,可依赖的 ACID 兼容设计和高级 MVCC 架构。XtraDB 在 InnoDB 的坚实基础上构建,使 XtraDB 具有更多的特性,更好调用,更多的参数指标和更多的扩展。

从实践的角度来看,XtraDB 被设计用来在多核心的条件下更有效的使用内存和更加方便,更加可用。

新的特性被用来降低 InnoDB 的局限性。

MariaDB 对存储引擎新特性的选择基于用户的需求和现实环境中的真实需求。

  • FederatedX 存储引擎 分布式存储
  • SphinxSE 存储引擎用于全文检索

官网介绍:https://www.mariadb.com/kb/en/about-sphinxse/

  • 更快的复制查询处理
  • 线程池
  • 更少的警告和bug
  • 运行速度更快
  • 多的 Extensions (More index parts, new startup options etc)
  • 更好的功能测试
  • 数据表消除
  • 慢查询日志的扩展统计
  • 支持对 Unicode 的排序
MariaDB存储引擎小结
引擎引擎优点缺点适用场景问题思考
Aria
XtraDB支持事务

1写入的效率较差
2占用更多的存储空间

需要事务支持的生产环境
FederatedX支持分布式系统需要使用分布式系统的情况

1.和单机相比的读写效率如何?
2.如某个RDBMS故障会发生什么?

SphinxSE支持全文检索

需要全文检索的情景
使用前要单独安装

MEMORY读写速度快1.重启后数据清空
2.占用内存空间
使用读频繁的基础代码表

可以创建Aria表再通过触发器定入memory表
aria表负责更新,memory表负责读取
重启后通过aria表初始化memory表

MERGE合并多个同构表进行操作

1.执行效率没有提升
2.本身没有任何约束

如:将数据进行分表存储(表的数
量随时间增长)
又需要对这些表
进行聚合操作,这时可以使用merge

感觉只是在使用的时候方便
并没有带来效率的提升
约束完全由基础表控制,这样会在多个表中
产生重复数据
archive插入速度非常快

1.只支持插入和查找
2.不支持索引

适用于日志类的,只插入不修改
且查询较少的数据.
CSV
BlackHole

官网的一些建议:

Choosing the right storage engine
  • Xtradb and InnoDBis a good general transaction storage engine and usually the best choice if unsure.

--Xtradb and InnoDB是一种很好的通用事务存储引擎,在无法确定如何选择时,它也许就是一种最佳的选择

  • MyISAMandAriahave a small footprint and allow for easy copy between systems. MyISAM is MySQL's oldest storage engine, while Aria is MariaDB's more modern improvement.

--MyISAMandAria占用的资源比较小,两者是兼容的,可以很容易的在这两个系统间进行迁移 . MyISAM是mysql最古老的存储引擎,而Aria是MariaDB对它的更先进的改进.

  • TokuDBis a transactional storage engine which is optimized for workloads that do not fit memory, and provides a good compression ratio.
  • MEMORYdoes not write data on-disk (all rows are lost on crash) and is best-used for read-only caches of data from other tables, or for temporary work areas.

--MEMORY不写数据到硬盘中(意味着重启将丢失),最适用于缓存其它表中的数据用于只读,或者用于临时工作

  • TheArchivestorage engine is, unsurprisingly, best used for archiving.

--Archive顾名思义最适用于存档类的数据

  • CONNECTallows access to different kinds of text files and remote resources as if they were regular MariaDB tables.
  • SphinxSEis used as a proxy to run statements on a remote Sphinx database server (mainly useful for advanced fulltext searches).
  • Spideruses partitioning to provide data sharding through multiple servers.
  • ScaleDBis a commercial storage engine suited for large-scale online transaction processing and data warehousing.

常用的有关存储引擎的操作命令

查看数据库可以支持的存储引擎:

show engines

查看某张表使用的存储引擎

Show create table tablename; //显示表的创建语句,其中包含存储引擎信息ENGINE=XXX
show table status like ‘XXX’G   //显示表的当前状态

创建表时指定:

Create tableXXX(
columnName(列名1)  type(数据类型)  attri(属性设置),
columnName(列名2)  type(数据类型)  attri(属性设置),
……..) engine = engineName

修改表的存储引擎:

Alter table tableName engine =engineName

免责声明:文章转载自《初识MariaDB存储引擎》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇composer安装依赖时报错的处理办法java 关键字 assert的学习下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySql中delimiter的作用是什么?

这个命令与存储过程没什么关系吧。其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。如输入下面的语句mysql> select * from test_table;然后回车,那么MySQL将立即执行该...

WEB漏洞挖掘技术总结

漏洞挖掘技术一直是网络攻击者最感兴趣的问题,漏洞挖掘的范围也在随着技术的提升而有所变化。在前期针对缓冲区溢出、格式化字符串、堆溢出、lib库溢出等技术都是针对ELF文件(Linux可执行文件)或者PE文件(Win可执行文件)的漏洞挖掘技术。   在针对ELF文件、PE文件(*.exe与*.dll)的漏洞挖掘过程中,出现了很多的漏洞挖掘技术,但是针对PE文件...

mysql主从之keepalive+MySQL高可用

一 keepalive介绍 1.1 keepalived 是什么 keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。 1.2 keepalived 工作原理 keepalived 是以VRRP 协议为实现基础的,VRRP 全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗...

几篇关于MySQL数据同步到Elasticsearch的文章---第三篇:logstash_output_kafka:Mysql同步Kafka深入详解

文章转载自:https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484411&idx=1&sn=1f5a371095d61bd0d6461ed111dd252b&chksm=eaa82bd3dddfa2c5b08831bfd4221178b277f03ec74e...

@Transactional各属性详解

地址:https://www.cnblogs.com/caoyc/p/5632963.html 事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean implements TestService {} 当类中某些方...

MySQL Workbench 如何连接 Amazon EC2 上的MySQL服务器?

最近在使用Amazon EC2 上的Ubuntu Linux. 为了方便管理MySQL, 使用一个图形界面的MySQL客户端总是可以提高效率的。不过如何连接EC2中的机器还是有点要注意的地方。 Connection Methond: 注意,这里一定要选择”Standard TCP/IP over SSH” SSH Hostname:  EC2 机器的名字...