MySQL管理之道:性能调优、高可用与监控(第2版)
上QQ阅读APP看书,第一时间看更新

1.3 MariaDB 10.0新增的功能

通过下面官网的对比图(见图1-2~图1-5),可以清晰地看到MariaDB 10新增加的功能。

图1-2 可伸缩性和可扩展性的对比

图1-3 性能对比

图1-4 NoSQL支持对比

图1-5 操作和安全上的对比

从图1-2~图1-5可以看到,在功能上,MariaDB 10.0已经完胜MySQ L5.6, MySQ L5.7才慢慢将缺失的功能追补上来,并且线程池、审计日志等功能是出现在MySQL企业版里的,需要付费。

1.3.1 更多的存储引擎

除了包含标准的MyISAM、BLACKHOLE、CSV、MEMORY、ARCHIVE和MERGE等存储引擎外,MariaDB的源代码包和二进制包还包含以下额外的存储引擎。

❑ Aria(增强版的MyISAM)

❑ XtraDB(增强版的InnoDB)

❑ FederatedX

❑ OQGRAPH

❑ SphinxSESphinxSE是一个可以编译进MySQL 5.x版本的MySQL存储引擎,它利用了该版本MySQL的插件式体系结构。尽管SphinxSE被称为“存储引擎”,但其自身并不存储任何数据。它其实是一个允许MySQL服务器与searched交互并获取搜索结果的嵌入式客户端。所有的索引和搜索都发生在MySQL之外。

❑ IBMDB2I

❑ TokuDB可以把TokuDB看成是ARCHIVE存储引擎的升级版,典型特征:插入速度快、压缩效率高、支持事务和MVCC版本控制。可以试图把一些LOG日志表改为TokuDB引擎,这样在性能和磁盘空间使用率上都有较大幅度的提升。此外,该引擎的备份工具是收费,所以备份的时候可以采取冷备份。

❑ Cassandra

❑ CONNECT

❑ SEQUENCE

❑ SpiderSpider为分库、分表存储引擎,腾讯的Tspider是基于MariaDB官方Spider引擎二次研发的,性能提高了30%,官方原版Spider目前还不稳定,性能有待加强。

❑ PBXT

1.3.2 速度的提升

在MariaDB 5.3版本里,就已经对子查询进行了优化,并采用semi join半连接方式将SQL改写为表关联join,从而提高了查询速度。

在MariaDB 5.3版本里引入group commit for the binary log组提交技术,简单来说,将多个并发提交的事务加入一个队列里,再将这个队列里的事务利用一次I/O合并提交,从而解决写日志时频繁刷磁盘的问题。

在MariaDB 10.0版本里引入基于表的多线程并行复制技术,如果主库上1秒内有10个事务,那么合并一个I/O提交一次,并在binlog里增加一个cid = XX标记,当cid的值一样时,Slave就可以进行并行复制,通过设置多个sql_thread线程实现。在MySQL 5.5版本里是单进程串行复制,通过sql_thread线程来恢复主库推送过来的binlog,这样会产生一个问题,主库上有大量的写操作,从库就有可能会出现延迟。MySQL 5.6是基于库级别的并行复制,MySQL 5.7是基于表级别的并行复制。

在MariaDB 5.5版本里引入线程池thread pool技术,线程池的连接复用减少了建立连接的开销,减少了CPU上下文切换,非常适合高并发php短连接应用场景(如使用开源电商平台ECSHOP秒杀业务场景)。

处理内部的临时表时,MariaDB用Aria引擎代替了MyISAM引擎,这会使某些GROUP BY和DISTINCT请求速度更快,因为Aria有比MyISAM更好的缓存机制。

1.3.3 扩展和新功能

MariaDB对服务层做了大量改善,增加了很多新的特性,如果一个补丁或功能是有用的、安全的、稳定的,那么MariaDB官方会尽一切努力在MariaDB发行版包括它。MariaDB 5.3版本里最显著的特点如下。

1.时间精确到微秒级别

一个额外的列TIME_MS已被添加到INFORMATION_SCHEMA.PROCESSLIST表里,用于查看微秒时间,如图1-6所示。

图1-6 显示微秒时间

2.提供了虚拟列(函数索引)

在MariaDB 5.2版本里就已经提供了虚拟列(函数索引),但直到MySQL 5.7版本才支持。

3.kill命令扩展

在MariaDB 5.3版本里又对kill命令进行了扩展,可以指定某个user用户,杀死所有查询(见图1-7)。

图1-7 杀死root账号连接

4.修改表结构可显示执行进度

通过alter table命令可以显示执行进度,如图1-8所示。

图1-8 修改表结构显示执行进度

5.提供了动态列(可以存储JSON格式)

在MariaDB 5.3版本里就已经提供了动态列(可以存储JSON格式),但直到MySQL 5.7版本才支持。

在MariaDB 10.0版本里则有以下显著特点。

❑ 提供多源复制,但直到MySQL 5.7版本才支持。

❑ 支持GTID同步复制。

❑ 创建用户支持创建角色(role)权限。

❑ 通过show processlist可以查看内存占用,如图1-9所示。

图1-9 显示内存使用

❑ 执行create or replace table ,等于先执行drop操作,再执行create操作,如图1-10所示。

图1-10 create语法扩展

❑ 执行delete from table returning命令,在删除前,可以返回要删除的记录,以便万一失手,可以拿到原始数据,如图1-11所示。

图1-11 delete语法扩展

❑ 慢查询日志(slow log)里增加了explain执行计划。

在my.cnf里添加以下代码:

        log-slow-verbosity=query plan, explain

会在慢日志里把执行计划也打印出来,以方便排查问题,如图1-12所示。

图1-12 慢日志