MariaDB原理与实现(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-17 11:05:53

点击下载

作者:张金鹏

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

MariaDB原理与实现

MariaDB原理与实现试读:

目标读者

这是一本讲解数据库原理及其具体实现的书,本书主要面向想要了解MariaDB和MySQL的工作原理及其具体实现的读者,以及想要阅读MariaDB和MySQL源代码却苦于不知道从何处开始的读者。

本书的整体思路是由简至繁,从基本原理到具体实现细节,书中由浅入深地剖析了MariaDB以及MySQL。

如果你想要阅读本书,首先必须具有一定的数据库基础知识;其次,你应该具备一定的C/C++语言知识,因为MariaDB/MySQL主要是用C/C++编写的,在分析具体实现的时候,我们会给出大量的源代码。

章节安排

本书的章节安排如下。

第1章描述了MariaDB相关的一些基础内容,包括MariaDB的历史、MariaDB所做的一些优化、MariaDB与MySQL的兼容性以及如何安装使用MariaDB,等等。

第2章讲解了MariaDB添加的新特性以及对MySQL原有功能所做的扩展。

第3章首先讲解了MariaDB源代码的组织结构以及MariaDB对函数和基本类型的封装,最后从实战的角度讲解了如何调试MariaDB。读者可以通过边调试边阅读MariaDB代码的方式来学习MariaDB。

第4章对MariaDB/MySQL中使用比较多的一些底层数据结构进行了介绍,为我们后面更深入地讲解MariaDB/MySQL各种功能的实现奠定了基础。

第5章详细分析了MariaDB的线程池技术,包括使用以及具体的实现机制。

第6章从实际的应用场景出发,详细阐述了binlog的相关内容。

第7章重点讲解了MariaDB的binlog group commit技术,该技术在具有高并发事务的场景下能够极大地提高MariaDB单位时间内的事务提交数。

第8章用很大的篇幅介绍了MariaDB/MySQL复制相关的内容,主要包括复制的工作原理、复制的实现、半同步复制、MariaDB多源复制、GTID,等等。

第9章讲解了数据库技术中用到的一些数据结构和算法,包括B+树数据结构、ORDER BY语句所使用的算法、JOIN相关的算法,等等。

第10章介绍了分布式数据库相关的一些内容,包括基本概念、特点、一些技术难点,等等。最后,我们分析了京东分布式数据库系统的架构。

附录A讲解了资源控制方面的一些内容,主要是关于如何利用Linux系统的CGroup机制来控制系统资源的使用情况,并且详细分析了CGroup各个子系统的具体实现。

我们建议读者按顺序来阅读本书,但你也可以挑选自己感兴趣的章节进行阅读。

致谢

这里我们要感谢京东云平台开放云事业部负责人郭理靖在本书编写过程中的大力支持以及相关的指导工作,感谢京东云平台云数据库组的田琪、闫国旗、张帅、杨轩嘉、都海峰在本书的编写过程中提供的大量支持和帮助,让本书的编写工作能顺利完成。

联系作者

在编写本书的过程中,我们尽全力做到最好,仍无法避免一些错误,如果你在本书中发现了错误,可以通过新浪微博(@弓长金鹏)与我们交流,我们将非常感谢。第 1 章MariaDB概述

2008年MySQL首先被Sun公司收购,之后Sun公司又被Oracle公司收购,MySQL也被包含在这次收购中。在这两次收购过程中,出现了多个MySQL的开源分支,其中比较主流的分支有Percona Server、MariaDB和Drizzle等。它们都有活跃的用户社区和一定程度上的商业支持,均由独立的服务供应商支持。

MariaDB是众多MySQL开源分支中非常出色的一个。作为MySQL的深度替代者,MariaDB很好地兼容了MySQL。同时,MariaDB在MySQL的基础上做了很多扩展,包含了许多新特性,例如支持binlog group commit技术,支持虚拟列和动态列,支持多源复制,等等。在性能方面,MariaDB也做了很多优化,例如更快的子查询、更快的字符集转换、为MyISAM存储引擎添加了分段键值缓存,让MyISAM存储引擎在现代硬件体系上运行得更快,等等。本章中,我们将介绍MariaDB的一些基本信息。

本章的内容主要包括:● MariaDB的历史● MariaDB所做的事情● MariaDB的版本与兼容性● 编译和安装MariaDB● 联系社区1.1 MariaDB的历史

在Sun收购MySQL之后,MySQL的创始人Monty Widenius离开了Sun公司,成立了Monty程序公司,创立了MariaDB,其主要目的是建立一个开放的开发环境,以鼓励外部人员参与。目前,MariaDB主要由社区开发和维护。

MariaDB对社区、开发者及用户的主要意义可以概括为以下几个方面:● 是一个永久开源的MySQL分支;● 高质量和持续性的开发测试及维护工作;● 来自社区开发者提交的补丁会被确认、接收和使用;● 维护MariaDB整个社区开发者的话语权,不会被某一个人或者组

织完全控制;● 持续保持和MySQL的兼容性。1.2 MariaDB所做的事情

MariaDB在MySQL的基础上做了许多工作,主要包括性能方面的优化以及许多新特性的支持。1.2.1 更丰富的存储引擎

除了包含标准的MyISAM、BLACKHOLE、CSV、MEMORY、ARCHIVE、MERGE等存储引擎外,MariaDB的源代码和二进制包中还包含以下额外的存储引擎:● Aria● XtraDB● PBXT● FederatedX● OQGraph● SphinxSE● IBMDB2I● TokuDB● Cassandra● CONNECT● Sequence● Spider1.2.2 性能的提升

MariaDB在很多地方都做了优化,其性能得到了不同程度的提升。MariaDB所做的优化主要包括以下几个方面。● 对子查询进行了优化,使子查询的速度得到了提升。● 更快、更安全的复制,引入了binlog group commit技术,使

MariaDB在某些场景下事务的提交速度得到成倍提升。● 提升了在Windows平台下InnoDB异步IO子系统的性能。● 提高了MEMORY存储引擎索引的插入速度。● 为MyISAM存储引擎增加了分段键值缓存,提升了MyISAM存储

引擎在现代硬件上的运行速度。● 表的校验更加快速。● 提升了字符集的转换效率。● 引入了线程池技术,解决了MySQL的最大连接数限制问题,降

低了大量连接情况下的系统开销。● 使用Aria存储引擎的表作为临时表,提升了某些复杂查询的效率。1.2.3 扩展和新特性

MariaDB是由社区开发和维护的,主要由用户的需求所驱动,如果某个功能对用户是有用的,MariaDB就会考虑将其加入进来,所以MariaDB包含了许多扩展和新特性。目前,MariaDB比较显著的扩展和特性主要包括以下几个。● 时间精度达到微秒级别。● 虚拟列的支持。● 动态列的支持。● 用户统计的扩展。● KILL命令的扩展,允许杀死某个用户的所有查询。● CREATE TABLE命令的扩展。● INFORMATION_SCHEMA.PLUGINS表的增强。● 引入了binlog group commit技术。● 命令的执行进度报告。● 更快的连接和子查询。● GIS功能的支持。● 支持多源复制,允许一个从库同时复制多个主库的数据。● GTID的支持,简化了复制的运行和维护工作。● 支持PCRE正则表达式。1.2.4 更好的测试

MariaDB在测试方面也做了很多工作,主要表现在以下几个方面。● 更多的测试。● bug修复的测试。● 配置不同的编译选项,获得更好的测试效果。● 移除无效的测试。1.2.5 尽量消除错误和警告

为了避免潜在的问题,在编译程序的时候,不要忽略编译器的警告信息,MariaDB在这方面做得非常好,具体如下所示。● 修复尽可能多的错误,避免引入新的错误。● 编译器的警告是不好的,消除尽可能多的警告。1.3 MariaDB的版本与兼容性

出于实用的目的,MariaDB是相同版本MySQL的二进制深度替代者,例如MariaDB 5.1、MariaDB 5.2和MariaDB 5.3对应于MySQL 5.1,MariaDB 5.5 对应于MySQL 5.5,MariaDB 10.0对应于MySQL 5.6。

MariaDB与MySQL的兼容性主要体现在以下几个方面。● 数据文件和表定义文件是二进制兼容的。● 所有的客户端API和协议都是兼容的。● 所有的文件名、二进制文件、路径、端口号等都是相同的。● 所有的连接器,包括PHP、Perl、Python、Java、.NET、Ruby、

MySQL的连接器在MariaDB上都是可以正常使用的,不需要进行

任何改动。● 可以使用MySQL的客户端连接到MariaDB上。

也就是说,在大多数情况下,卸载已有的MySQL并安装对应版本的MariaDB,就可以工作得很好,不需要转换任何的数据文件,前提是使用对应版本的MariaDB,例如使用MariaDB 5.1替换MySQL5.1。同时,你必须还要运行mysql_upgrade来完成升级,确保你的MySQL权限和事件表更新了MariaDB的新字段。

MariaDB每个月都会与MySQL代码库合并来确保兼容性,并添加Oracle修正的bug和特性。MariaDB在脚本升级方面也做了大量的工作,从MySQL 5.0升级到MariaDB 5.1比从MySQL 5.0升级到MySQL 5.1更容易。1.3.1 MariaDB 5.1和MySQL 5.1的不兼容性

为了使MariaDB提供更多、更有用的信息,在极少的一些情况下会导致MariaDB和MySQL不兼容。下面列出了从用户角度来看MariaDB 5.1与MySQL 5.1的所有不兼容性。● 安装包的名称以MariaDB开头,而不是以MySQL开头。● 在my.cnf配置文件中,可以使用[mariadb]来替代[mysqld]。● 在MariaDB中加载其他二进制的存储引擎时,如果该存储引擎不

是使用对应的MariaDB版本编译的,那么该二进制的存储引擎将

不可用。这是因为服务器的内部数据结构THD在MariaDB和

MySQL中是不同的,而且在MariaDB/MySQL的不同版本中也是

不同的。通常这不是问题,因为对于大多数人来说,不需要加载

二进制的存储引擎,MariaDB本身就拥有比MySQL更多的存储引

擎。● 表的校验可能产生不同的结果,因为MariaDB在校验的时候并不

忽略NULL列(新式校验方法),而MySQL 5.1在校验的时候会忽

略NULL列(旧式校验方法)。在MariaDB中,开启mysqld --old

选项,你将会得到旧式的校验结果。但需要注意的是,MyISAM

存储引擎和Aria存储引擎内部使用的是新式校验方式,所以当你

使用了--old选项时,CHECKSUM命令将会执行得很慢,因为执

行该命令的时候需要一行一行地扫描表的数据,然后按照“旧

式”的方法生成校验结果。● MariaDB的慢查询日志包含了更多关于查询的信息,如果你使用

已有的慢查询日志解析脚本对MariaDB的慢查询日志进行解析可

能会出现问题。● MariaDB占用的内存通常会比MySQL多一点,因为在默认情况

下,MariaDB会启用Aria存储引擎来操作内部临时表。如果想让

MariaDB占用较少的内存(这将会牺牲一些性能),你可以设置

aria_pagecache_buffer_size的值为1MB(默认值为128MB)。● 如果你正在使用MariaDB的新选项、新特性或者新存储引擎,那

么就不能在MySQL和MariaDB之间进行切换。1.3.2 MariaDB 5.2和MySQL 5.1的不兼容性

除了上一节中列出的MariaDB 5.1和MySQL 5.1的不兼容性之外,MariaDB 5.2还有一些地方与MySQL 5.1不兼容。例如新增SQL_MODE的取值IGNORE_BAD_TABLE_OPTIONS,该选项会忽略由于存储引擎不支持某些选项而导致的错误。1.3.3 MariaDB 5.3和MySQL 5.1、MariaDB 5.2的不兼容性

MariaDB 5.3不仅与MySQL 5.1在某些地方不兼容,同时与MariaDB 5.2也有一些地方不兼容。● 由于转换而导致的错误,MariaDB提供了更加详细的说明。● MariaDB的错误编号已经从1900开始,目的是避免与MySQL的错

误编号产生冲突。● MariaDB从5.3开始,内部使用的时间精度为微秒,而在MySQL

内部以及5.3以前版本的MariaDB中,时间精度为毫秒。● 在MariaDB中返回的是包含6位小数的时间戳,但是MySQL返回

的时间戳是不带小数的。当你使用UNIX_TIMESTAMP 作为分区

函数时,会导致一些问题。修复这些问题可以使用

FLOOR(UNIX_TIMESTAMP())函数代替或者是将日期字符串改成

日期数字,如20080101000000。● MariaDB对于类型date、datetime和timestamp值的检查更加严格,

如 UNIX_TIMESTAMP("x") 返回的是NULL,而不是0。● SHOW PROCESSLIST 拥有一个额外的进度列,显示了命令的

执行进度。通过启动mysqld时携带--old-

mode=NO_PROGRESS_INFO或者--old选项来禁用该功能。● INFORMATION_SCHEMA.PROCESSLIST表新增了3个字段用于

扩展命令执行进度报告功能,即STAGE、MAX_STAGE和

PROGRESS。● 若长注释以/*M!或者/*M!#####开头,注释内的命令将会被执行。● MariaDB在启动mysqld时,如果使用了

max_user_connections=0(即不对连接数加以限制)参数,那么

在mysqld运行的时候不能改变全局变量max_user_connections的

值。这是因为启动mysqld时带上max_user_connections=0,

MariaDB内部不会分配计数结构。如果之后改变了这个变量,将

会导致错误的计数。● 可以将max_user_connections设置为-1阻止用户连接服务器,但

拥有SUPER权限的用户还是可以连接上的。● IGNORE指令不会忽略所有的错误,仅仅会忽略安全的错误。1.3.4 MariaDB 5.5和MariaDB 5.3的不兼容性

XtraDB存储引擎之前版本中的某些选项在XtraDB 5.5中将不再支持,具体包括以下几个方面。● innodb_adaptive_checkpoint:使用

innodb_adaptive_flushing_method替代。● innodb_auto_lru_dump:使用

innodb_buffer_pool_restore_at_startup替代。● innodb_blocking_lru_restore:使用

innodb_blocking_buffer_pool_restore替代。● innodb_enable_unsafe_group_commit● innodb_expand_import:使用

innodb_import_table_from_xtrabackup替代。● innodb_extra_rsegments:使用innodb_rollback_segment替代。● innodb_extra_undoslots● innodb_fast_recovery● innodb_flush_log_at_trx_commit_session● innodb_overwrite_relay_log_info● innodb_pass_corrupt_table:使用innodb_corrupt_table_action替

代。● innodb_use_purge_thread● xtradb_enhancements

XtraDB 5.5的某些选项的默认值发生了改变,主要有以下几项。● innodb_change_buffering的旧默认值为inserts,新默认值为all。● innodb_flush_neighbor_pages的旧默认值为1,新默认值为

area。

XtraDB 5.5添加了一些新的选项,具体如下:● innodb_adaptive_flushing_method● innodb_adaptive_hash_index_partitions● innodb_blocking_buffer_pool_restore● innodb_buffer_pool_instances● innodb_buffer_pool_restore_at_startup● innodb_change_buffering_debug● innodb_corrupt_table_action● innodb_flush_checkpoint_debug● innodb_force_load_corrupted● innodb_import_table_from_xtrabackup● innodb_large_prefix● innodb_purge_batch_size● innodb_purge_threads● innodb_recovery_update_relay_log● innodb_rollback_segments● innodb_sys_columns● innodb_sys_fields● innodb_sys_foreign● innodb_sys_foreign_cols● innodb_sys_tablestats● innodb_use_global_flush_log_at_trx_commit● innodb_use_native_aio1.3.5 MariaDB 5.5与MariaDB 5.3和MySQL 5.5的不兼容性

除了1.3.4节介绍的XtraDB在MariaDB 5.5和MariaDB 5.3中的不兼容性,MariaDB 5.5与MariaDB 5.3和MySQL 5.5还具有以下几个不兼容的地方。● INSERT IGNORE会对重复键值给出警告信息。通过设置

OLD_MODE=NO_DUP_KEY_WARNINGS_WITH_IGNORE,可

以关闭INSERT IGNORE对重复键值的警告。● X'HHHH'在标准SQL语法中是用来表示二进制字符串的,但在

MariaDB 5.5.31之前,它将被错误地理解为数字,和0xHHHH的

作用一致。而在MariaDB 5.5.31中,该问题已被修复了,

X'HHHH'只能表示字符串。1.3.6 MariaDB 10.0和MySQL 5.6的不兼容性

作为MariaDB目前最新的版本,MariaDB 10.0与MySQL 5.6的不兼容性包括以下几个方面。● 如果仅仅给出了选项的前缀部分,例如使用--big-table取代--big-

tables,MySQL将会给出警告,而MariaDB将会正常工作。也就

是说,只要给出的前缀部分能够唯一地标识该选项即可。● MariaDB的GTID和MySQL 5.6的GTID不能兼容,也就是说

MySQL 5.6不能作为MariaDB 10.0的从库。● 为了使CREATE TABLE ... SELECT命令在基于行模式复制和基

于命令模式复制的情况下都能正常工作,MariaDB中CREATE

TABLE ... SELECT命令在从库上将会被转化成CREATE OR

RPLACE命令执行。这样的好处是即便从库在执行CREATE

TABLE ... SELECT命令时宕机了,仍然能够正常工作。1.4 编译和安装MariaDB

在使用MariaDB或者学习MariaDB之前,建议首先在你的机器上安装MariaDB。安装方式主要有两种,一是使用二进制安装包进行安装,二是使用源代码进行编译安装,下面我们分别进行介绍。1.4.1 使用二进制安装包进行安装

使用二进制安装包安装MariaDB是非常简单的,主要步骤如下。

(1) 根据自己的系统平台,前往MariaDB官方网站获取MariaDB对应的二进制安装包:https://downloads.mariadb.org/。

(2) 解压下载的安装包,将解压后的二进制文件复制到指定的目录:shell> tar zxvf mariadb-10.0.6-x86_64.tar.gzshell> cp -r mariadb-10.0.6-x86_64/* /usr/local/mariadb10/

(3) 创建MariaDB用户组和用户:shell> groupadd mariashell> useradd -r -g maria maria

(4) 改变目录权限:shell> cd /usr/local/mysqlshell> sudo chown -R maria .shell> sudo chgrp -R maria .

(5) 初始化MariaDB系统表:shell> sudo scripts/mysql_install_db --user=mariashell> sudo chown -R maria data

(6) 启动MariaDB server进程:shell> cd /usr/local/mysqlshell> sudo bin/mysqld_safe --user=maria &1.4.2 使用源代码进行编译安装

使用源代码编译安装MariaDB主要包括以下几个步骤。

(1) 获取MariaDB源代码包。前往MariaDB官方网站的下载页面(https://downloads.mariadb.org/)下载MariaDB的源代码。

(2) 解压MariaDB源代码包:shell> tar zxvf mariadb-10.0.6.tar.gz

(3) 编译与安装MariaDB。

MariaDB 5.5以及更高的版本使用了cmake工具进行编译,具体的步骤如下所示。

(a) 首先你可以使用cmake的默认配置,也可以为cmake添加选项:shell> cd mariadb-10.0.6shell> cmake .

(b) 运行完cmake之后,建立和安装:shell> makeshell> sudo make install

(c) 创建MariaDB用户组和用户:shell> groupadd mariashell> useradd -r -g maria maria

(d) 改变目录权限:shell> cd /usr/local/mysqlshell> sudo chown -R maria .shell> sudo chgrp -R maria .

(e) 初始化MariaDB系统表:shell> sudo scripts/mysql_install_db --user=mariashell> sudo chown -R maria data

(f) 启动MariaDB server进程:shell> cd /usr/local/mysqlshell> sudo bin/mysqld_safe --user=maria &

(4) 连接到MariaDB server。此时,MariaDB已经安装完成,并且处于运行状态,可以使用客户端连接并进行操作:shell> cd /usr/local/mysqlshell> bin/mysql -uroot

在执行cmake命令生成Makefile的时候,可以根据自己的需求为cmake添加不同的参数,达到定制Makefile的目的。执行cmake . -Lh命令,可以查看cmake可选的参数。表1-1列出了cmake可以携带的所有参数,并给出了它们的含义和默认值。

表 1-1 cmake参数列表参数描述默认值CMAKE_BUILRelW编译类型,可选的值包括:Debug、D_TYPEithDebInfoRelease、RelWithDebInfo、MinSizeRel/usr/CMAKE_INSTlocal/安装目录前缀ALL_PREFIXmysqlCOMMUNITY是否是社区共建ON_BUILDCONNECT_W是否支持使用LIBXML2连接存储引ONITH_LIBXML2擎CONNECT_W是否支持远程MySQL连接ONITH_MYSQLCONNECT_W是否支持ODBC连接ONITH_ODBCCONNECT_W是否支持索引文件映射方式连接ONITH_XMAPENABLE_DE是否启用同步调试ONBUG_SYNCENABLE_GC是否包含GCOV支持ONOVENABLED_P是否启用代码查询分析ONROFILINGSTAINSTALL_LAY安装目录布局。选项有NDALONOUTSTANDALONE、RPM、DEB、SVR4E/usr/MYSQL_DATlocal/MySQL数据目录ADIRmysql/dataODBC_INCLU/usr/包含sql.h文件的目录DE_DIRinclude/usr/ODBC_LIBRA指定ODBC驱动管理库lib/RYlibodbc.so TMPDIR存放MariaDB临时文件的路径USE_ARIA_F使用Aria临时表ONOR_TMP_TABLESWITH_ARCHIVE_STORAGE_E归档静态连接到服务器OFFNGINEWITH_ARIA_STORAGE_ENGIN是否安装Aria存储引擎ONEWITH_BLACKHOLE_STORAGE是否安装BLACKHOLE存储引擎OFF_ENGINEWITH_CONNECT_STORAGE_是否安装CONNECT存储引擎OFFENGINEWITH_EMBE是否在嵌入式服务下编译MariaDBOFFDDED_SERVERWITH_EXTRA额外的字符集all_CHARSETSWITH_FEDERATEDX_STORAG是否安装FederatedX存储引擎OFFE_ENGINEWITH_FEEDB是否安装FEEDBACK存储引擎OFFACKWITH_LIBWR是否支持libwrapOFFAPWITH_LOCAL是否静态关联LOCALESOFFESWITH_META是否静态关联DATA_LOCK_INFOFFMETADATA_LOCK_INFOOWITH_PARTITION_STORAGE_是否安装PARTITION存储引擎ONENGINEWITH_PERFSCHEMA_STORAG是否安装PERFSCHEMA存储引擎ONE_ENGINEWITH_QUER是否静态关联OFFY_CACHE_INFOQUERY_CACHE_INFOWITH_QUER是否静态关联Y_RESPONSE_TIOFFQUERY_RESPONSEMEWITH_READL使用捆绑的readlineOFFINEWITH_SEMIS是否静态关联OFFYNC_MASTERSEMISYNC_MASTERWITH_SEMIS是否静态关联SEMISYNC_SLAVEOFFYNC_SLAVEWITH_SEQUENCE_STORAGE是否安装Sequence存储引擎OFF_ENGINEWITH_SPHINX_STORAGE_EN是否安装Sphinx存储引擎OFFGINEWITH_TEST_SQL_DISCOVERY是否安装TEST_SQL_DISCOVERYOFF_STORAGE_ENGI存储引擎NEWITH_UNIT_是否编译MariaDB单元测试ONTESTSWITH_VALGR是否支持VALGRINDOFFINDWITH_XTRADB_STORAGE_EN是否安装XtraDB存储引擎ONGINEsysteWITH_ZLIB是否支持zlibm1.5 联系社区

MariaDB是由社区进行开发和维护的,当你碰到MariaDB的相关问题时,可以与社区取得联系。下面我们给出几个社区的联系方式。● Launchpad团队和邮件列表。MariaDB项目托管在Launchpad

上,一个好的开始是去加入Launchpad团队。下面简要介绍一下

各个团队。● maria-discuss团队和邮件列表,适合MariaDB用户和一般讨论。● maria-docs团队和邮件列表,适合对于文档感兴趣的人。● maria-developers团队和邮件列表,适合一些想贡献代码或是密切关注MariaDB开发动态的人。● maria-captains团队和邮件列表,适合受信任的开发人员将代码合并到官方的分支。● MariaDB Commits列表。提交邮件发送到commit@mariadb.org。

任何人都能够订阅提交邮件或是查阅相关提交档案。● MariaDB Captains。Maria-captains是MariaDB核心开发团队。只

要有足够的技术、技能并且积极参与MariaDB开发,都能成为这

个团队里的一员。● MariaDB公告列表。如果你只是想知道最新MariaDB的消息,如

MariaDB的最新发行版本,你可以订阅annouce@mariadb.org,

也可以查阅公告档案信息。● IRC。Maria项目官方IRC频道是irc.freenode.net/maria。

irc:irc.freenode.net/maria-meeting频道用于官方会议。为了用户

的利益,官方并没有为开发者单独设立一个频道。● 讨论组。你可以在许多的开源讨论组里找到研究MariaDB的人,

如O'Reilly MySQL讨论组、OSCON和Open Source bridge。也可

以参考MariaDB开发者所维护的讨论组列表:https://mariadb.org/

en/conference/。● 要求增加新特性。如果想要新增一个特性,既可以在MariaDB官

方网站的JIRA系统中提交,也可以自己完成这个特性并且成为

MariaDB的开发者。● MariaDB知识基础。MariaDB知识基础是一个手册,也是一个帮

助文档,在这里你能提问和回答关于特定MariaDB/MySQL的一

些问题。1.6 小结

本章中,我们介绍了MariaDB的一些基本信息,首先概览了MariaDB的历史以及MariaDB主要做的一些事情,接着介绍了MariaDB和对应版本的MySQL的兼容性,最后讨论了如何对MariaDB进行编译和安装。

 第 2 章MariaDB的扩展和新特性

作为MySQL的深度替代者,MariaDB的主要宗旨是朝着用户和开发者所期望的方向发展,只要是用户需要的、对用户有用的特性都会被添加进来。随着MariaDB的发展,越来越多有用的特性被加入进来。例如,更多的存储引擎被添加到MariaDB中用于满足不同的用户需求,binlog group commit技术大大提高了MariaDB在高并发事务情况下的性能,通过线程池技术让MariaDB支撑更多的连接,等等。本章中,我们将介绍MariaDB所包含的一些新特性以及对MySQL原有功能做的一些扩展。

本章的内容主要包括:● 更多的存储引擎● 线程池技术和binlog group commit技术● MariaDB其他扩展和新特性2.1 更多的存储引擎

MariaDB一个很显著的特点就是除了包含一些标准存储引擎(例如MyISAM、InnoDB、Heap、Blackhole、Archive、CSV等)外,还包含了许多额外的具有不同作用的存储引擎,并且包含了自己特有的存储引擎Aria。你可以通过在MariaDB源代码的storage目录下执行ls命令来查看所有存储引擎,如图2-1所示。图 2-1 MariaDB的存储引擎2.1.1 全新的Aria存储引擎

Aria是MariaDB的一个全新的存储引擎,它是作为MyISAM存储引擎的替代者而开发的。该存储引擎从2007年开始开发,其开发者是开发MySQL server、MyISAM、MERGE以及MEMORY存储引擎的主要成员。

目前,Aria存储引擎的最新版本是1.5,在安全方面,它拥有崩溃自动恢复功能,比MyISAM更安全;在性能方面,Aria有比MyISAM更好的缓存系统,所以相对于MyISAM有一定的提升。Aria目前还不支持事务,在未来的版本中(2.0)将完全支持事务。

1. Aria名字的由来

在Maria项目刚建立的时候,Monty(MySQL和MyISAM的创始人)和最初的开发者只是想开发下一代MyISAM存储引擎,使其具有崩溃恢复功能,并且能够提供事务的支持。Monty以他女儿的名字Maria作为该项目以及该存储引擎的名字。项目按部就班地进行着,随着项目的进行,事情发生了变化,开发者们不仅仅是工作在Maria存储引擎上,而是工作在MySQL的一个完整分支上,既然这个项目叫Maria,那么这个MySQL的分支就很自然地被命名为MariaDB,这就是MariaDB的诞生过程。后来为了区分MariaDB与Maria存储引擎,Maria存储引擎被重新命名为Aria。

2. Aria的相关参数● 创建Aria表的可选参数Aria存储引擎为CREATE TABLE命令提供了一些额外的选项

供用户选择,具体如下所示。● TRANSACTION= 0 | 1。在创建表时,你可以通过指定该选项的值来决定是否让你的表支持崩溃恢复。在默认情况下,该选项的值为0,也就是说默认情况下创建的Aria表是不支持崩溃恢复的。如果指定了该选项的值为1,所有的修改都会被记录到事务日志中。在这种情况下,会降低写入和更新的速度,但当系统崩溃重启时,能够根据事务日志的内容对执行到一半的命令进行回滚,使数据库恢复到命令执行前的状态。● PAGE_CHECKSUM= 0 | 1。数据块和索引块是否添加额外的校验。● TABLE_CHECKSUM= 0 | 1。表是否添加额外的校验。● ROW_FORMAT= PAGE。Aria存储引擎除了支持MyISAM的所有行格式(FIEXD和DYNAMIC)外,还支持页模式的行格式,所有的数据和索引存储在页内,页模式只有在TRANSACTION=1的时候才会生效。在Aria的缓存机制中,页模式下缓存的是一个个的页。如果你想在Aria中创建一个类似于MyISAM的非事务表,可

以通过设置以下参数来达到目的:

CREATE TABLE t1 (a int) ROW_FORMAT=FIXED

TRANSACTIONAL=0 PAGE_CHECKSUM=0;或者

CREATE TABLE t1 (a int) ROW_FORMAT=DYNAMIC

TRANSACTIONAL=0 PAGE_CHECKSUM=0;● mysqld中与Aria相关的可选参数在mysqld启动的时候,有一些与Aria存储引擎相关的选项,

如表2-1所示。表 2-1 mysqld启动时与Aria存储引擎相关的选项选项描述默认值使用或者禁用Aria插件,可选的值为ON、--aria[=#]OFF、FORCE(如果加载失败,mysqld将启`ON`动失败)--aria-block-Aria索引页的大小8192size=#--aria-checkpoint-多久创建一次检查点,单位为秒30interval=#--aria-force-当根据日志执行错误恢复时,如果连续出现start-after-该参数指定个数的错误时,将采用删除日志0recovery-的方法来解决问题。0代表不使用该特性failures=#指定Aria存储引擎的group commit(gc)的模--aria-式,可选的值有none(不使用gc)、hard(等nonegroup-待提交完成)、soft(不等待提交完成,存在风commit=#险)--aria-group commit的时间间隔,单位为微妙group-(1/1000000秒)。该选项只有在group commit0commit-开启的状态下才能生效interval=#--aria-log-dataddir-path= 存储事务日志的文件夹irname1073--aria-log-事务日志文件的最大容量7418file-size=#24--aria-log-immeAria事务日志的清理策略。可选的值为purge-immediate、external和at_flushdiatetype= name9223--aria-max-3720在执行ORDER BY或者GROUP BY命令时,sort-file-3685当结果集比较大时会使用临时文件size=#3727232--aria-page-TRU页面校验checksumE--aria-页缓存中,被评为热块(hot block)的阈值。pagecache-页缓存中的页命中次数达到该值后才能被认300age-定为是热块threshold=#1342--aria-1772pagecache-0 (= Aria表的数据库和索引块使用的缓存区大小buffer-128Msize=#B)--aria-pagecache-暖块(warm block)的最小百分比100division-limit=#指定损坏的表如何自动修复,可选的值有--aria-NORNORMAL、BACKUP、FORCE、QUICK和recover[=#]MALOFF--aria-repair-1修复表时使用的线程数thread=#--aria-sort-当Aria进行表修复时执行的索引排序以及用户1342bufer-调用CREATE INDEX或ALTER TABLE创建索1772size=#0引时使用的缓存区大小nulls--aria-stats-对于NULL值的统计方式,可选的值有_unemethod=#nulls_unequal、nulls_equal和nulls_ignoredqual--aria-sync-newfil可选的值有never、newfile和alwayslog-dir=#e通常情况下,需要重点关注的几个参数有下面几个。● aria-pagecache-bufer-size。所有的数据和索引都缓存在这个buffer中,该buffer越大Aria的运行速度就越快。● aria-block-size。块大小,其默认值8192在大部分情况下都是可以的。通常情况下,块内查找使用的是二分查找,但在块内使用压缩存储键值的时候,在块内使用的是扫描查找,aria-block-size的值太大会影响块内的查询时间。可选的值为2048、4096和8192。● aria-log-purge-type。如果你想保留事务日志文件并将其作为备份,请将该参数设置为af_flush。

3. Aria的PAGE行格式

MyISAM的DYNAMIC和FIXED行格式非常简单,而且不会占用过多的额外空间,当数据不会被修改的时候,它们表现得非常优秀。如果修改比较多,而且修改后的行数据比原来大,那么对于DYNAMIC行格式,性能会急剧下降。使用PAGE行格式,即使有大量的更新操作,也不会像DYNAMIC行格式那样,它仅会产生非常少的碎片。同时,PAGE行格式使用了页缓存,具有很好的随机性能。

4. Aria的优缺点

与MyISAM存储引擎相比,Aria存储引擎具有很多的优点,具体如下所示。● Aria的数据和索引具有崩溃恢复功能,如果发生崩溃,Aria会回

滚到命令执行前的状态。● Aria能重放事务日志中的所有内容,因此你可以使用事务日志来

备份Aria。但有一些不能重放:往空表批量插入(包括LOAD

DATA INFILE、SELECT ... INSERT和INSERT多行)),ALTER

TABLE操作。● LOAD INDEX能够跳过一些不需要的索引页。● 除了支持所有MyISAM的行格式外,还支持页格式,数据存储在

页内,页的默认大小为8KB。● 支持对一张表的并发插入操作。● 当使用页格式时,数据缓存在页缓存中。● 同时支持崩溃恢复表类型(未来将实现事务)和非事务表类型。

相对于MyISAM存储引擎,Aria存储引擎也存在一些缺点,具体如下所示。● Aria不支持延迟插入。● 当使用页格式时,如果每一行的数据比较小(<25字节),Aria的

性能会受影响。

在Aria的未来版本中,以上两个问题都将解决。2.1.2 XtraDB存储引擎

XtraDB是目前MariaDB的默认存储引擎。XtraDB是由Percona公司基于InnoDB开发的高性能存储引擎,其主要目的是用于替代现有的InnoDB。可以将XtraDB看作是InnoDB的增强版本,它在InnoDB上进行了大量的修改,完全兼容现有的InnoDB,并且提供了许多InnoDB不具备的功能。

XtraDB对InnoDB主要做了以下一些优化。● XtraDB在多核CPU上的性能和伸缩性更好。● XtraDB对于内存的分配和使用更加合理和高效。● 解除了InnoDB的许多限制。● 提供了比InnoDB更多的配置和性能监控参数。

对于高负载的MariaDB/MySQL应用来说,完全可以使用XtraDB存储引擎来替代InnoDB存储引擎。2.1.3 SphinxSE存储引擎

SphinxSE存储引擎主要用于全文检索,MariaDB从5.2开始将SphinxSE存储引擎加入进来。SphinxSE存储引擎是Sphinx项目的一部分,Sphinx是用C++编写的一款开源搜索引擎。虽然名字叫存储引擎,但SphinxSE不会真正地存储数据,它只是一个内置的客户端,让MariaDB/MySQL能够和Sphinx进行通信,能够在MariaDB/MySQL中执行查询语句,而Sphinx将匹配的结果返回来。所有的索引动作和搜索动作都发生在MariaDB/MySQL之外。

想要通过SphinxSE存储引擎进行搜索,你首先必须创建一个存储引擎为SphinxSE的表,然后在这个表上进行SELECT查询。

下面我们简单介绍一下如何使用SphinxSE。

首先通过CREATE TABLE创建一个表,指定存储引擎为Sphinx,并且指定Sphinx的searchd的位置以及使用哪个索引。搜索时只需要按照Sphinx的格式来执行SELECT语句就能返回想要的结果。相关代码如下:CREATE TABLE t1( id INTEGER UNSIGNED NOT NULL, weight INTEGER NOT NULL, query VARCHAR(3072) NOT NULL, group_id INTEGER, INDEX(query)) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/test";SELECT * FROM t1 WHERE query="test it;mode=any";

可以登录http://sphinxsearch.com查询与Sphinx相关的更加详细的信息。2.1.4 FederatedX存储引擎

FederatedX存储引擎是Federated存储引擎的一个分支,其主要作用是访问远程的数据源。FederatedX存储引擎表并不存放实际的数据,它只是指向一台远程MySQL/MariaDB数据库服务器上的表。FederatedX存储引擎通过libmysql来访问远程的数据库。当前的FederatedX存储引擎只支持MySQL/MariaDB的表,不支持异构的数据库表。2.1.5 TokuDB存储引擎

MariaDB从5.5开始加入了TokuDB存储引擎,该存储引擎使用了分形树作为内部索引的结构,在插入性能上表现优异。TokuDB非常适合插入性能要求特别高的应用场景。2.1.6 Cassandra存储引擎

Cassandra存储引擎是一个NoSQL的存储引擎,MariaDB在10.0中引入了该引擎。MariaDB可以借助Cassandra存储引擎来访问Cassandra集群的数据,你可以通过多个MariaDB实例访问同样的Cassandra集群的数据,只要这些MariaDB的实例上都安装了Cassandra存储引擎。

Cassandra存储引擎的主要目的是为了将SQL和NoSQL的数据进行整合。Cassandra存储引擎提供了类似SQL的查询语句(CQL)来访问Cassandra集群中的数据。Cassandra存储引擎并没有让Cassandra成为一个SQL数据库,Cassandra存储引擎只是一个由SQL世界通往NoSQL世界的窗口,如图2-2所示。图 2-2 Cassandra存储引擎2.1.7 CONNECT存储引擎

有一部分数据以纯文本文件的形式或者其他的形式存储于关系数据库之外,而在许多企业中,这些数据需要在不同的系统中使用。通常的做法是通过ETL(Extract,Transform,Load)系统对这些数据进行处理,然后导入到关系数据库中供一些系统方便地使用。当这些外部数据的数据量非常大的时候,ETL系统需要花费很长的时间来处理这些数据。

上面描述的是外部数据的访问和管理问题。要是有一种方法能够轻松访问这些数据,和访问关系数据库中的数据那样,但是这些数据又不需要经过ETL之类的系统进行加工那该多好。因为我们知道,当外部数据量非常大时,ETL系统会消耗很长的时间来处理这些数据。CONNECT存储引擎在某些方面解决了这个问题。MariaDB从10.0开始引入了CONNECT存储引擎。它允许MariaDB像访问数据库中表的数据那样访问外部数据。CONNECT存储引擎具有以下特点。● 不需要添加额外的SQL语句扩展,通过CONNECT存储引擎可以

用访问数据库内部表一样的方式访问外部数据。● 内置了许多类型的外部数据的封装器,例如纯文本和一些数据源

等。● 能够通过CONNECT存储引擎对文本形式以及大多数数据源形式

的外部数据进行读和写。● CONNECT存储引擎只会访问需要的数据,不会访问多余的数据。● 支持索引、特殊列和虚拟列。● 对于分区表,能够实现并发执行。● 能够在远程服务器上执行复杂查询。● 提供了C++的接口让用户可以针对外部数据的类型定制封装器。

以上我们只是对CONNECT存储引擎进行了简单的介绍,有兴趣想要更深一步了解的读者可以自行查阅相关的资料。2.1.8 Sequence存储引擎

Sequence存储引擎能够生成一个升序或者降序的整数序列,你可以指定这个序列的起始值和终止值以及序列增加的步长。Sequence存储引擎的表是虚拟的、短暂的,是不能持久化的,同时是只读的。Sequence存储引擎的表是在你执行SELECT语句时自动创建的,没有一种类似执行CREATE命令的方法来创建它们。创建一个Sequence存储引擎的表不会在磁盘上写入任何内容,也不会创建.frm格式的文件。MariaDB从10.0开始引进了Sequence存储引擎。

Sequence表的使用非常简单。当你想使用一组序列时,执行简单的SELECT语句就能返回你想要的序列,例如:SELECT * FROM seq_1_to_5;+-------+| seq |+-------+| 1 || 2 || 3 || 4 || 5 |+-------+

有两种形式的SELECT语句可以返回一组序列:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载