Mysql 5.6 在性能、可伸缩性、可用性方面的新突破<二>

来源:互联网 发布:idc 人工智能研究报告 编辑:程序博客网 时间:2024/05/16 09:47
<接上篇>
更好的应用程序可用性:在线 DDL/模式 变化
    如今基于web的应用程序被设计用来快速的进化以及自适应业务和生产需求。当一个应用程序必须迅速适应新的产品线或新产品时,后端数据库模式也必须跟着适应,但是又要求同时应用程序可以正常的业务操作。mysql5.6提供了这种程度的在线模式,此新语法为ALTER TABLE DDL,其他附加有:
CREATE INDEX
DROP INDEX
Change AUTO_INCREMENT value for a column
ADD/DROP FOREIGN KEY
Rename COLUMN
Change ROW FORMAT, KEY_BLOCK_SIZE for a table
Change COLUMN NULL, NOT_NULL
Add, drop, reorder COLUMN 

DBA和开发者们可以在标准的innoDB表上增加索引或者其他的修改操作,同时数据库依然可以供应用程序使用。这对于快速迭代的应用非常有益,特别是开发人员需要模式的灵活性,以适应不断变化的业务需求。

更好的开发灵活性:为innoDB增加Nosql
    Mysql5.6为innoDB提供了memcached API。为mysqld增加一个新的memcached守护进程插件,这样memcached协议被直接映射到本机的innoDB API,允许开发者使用现存的memcached客户端来直接忽略掉查询语法的解析消耗,直接对数据进行查找和修改。这些API可以对现有的memcached库和客户端进行重用,整合一个持久、事故安全、事务数据库后端 来对memcached功能进行了扩展。实现如下:
测试结果显示,在整体吞吐量上,SET/INSERT操作性能要提升9倍左右:
不仅开发者和DBA们获得了更好的性能和灵活性,同样也减少了复杂性,压缩之前单独的缓存和数据库层到一个单一的数据管理层次,这样消除缓存一致性维护的开销。

更好的开发灵活性:InnoDB扩展使用案例
    mysql5.6新的特征和优化器将innoDB扩展到更多的使用案例中去,这样开发者可以标准化一个单一的存储引擎 已达到简化应用程序的目的。
    新的全文索引(FTS) - 为了取代Myisam的FTS,现在InnoDB允许开发者在表上建立FULLTEXT索引来标示文本内容,同时也加快了应用搜索单词和短语。InnoDB的全文搜索支持自然语言/逻辑模式、邻近搜索 和 相关性排序。一个简单的使用例子如下:
CREATE TABLE quotes 
(id int unsigned auto_increment primary key ,
 author varchar(64) ,
 quote varchar(4000) ,
 source varchar(64) ,
 fulltext(quote) 
) engine=innodb; 

SELECT author AS “Apple" FROM quotes 
WHERE match(quote) against (‘apple' in natural language mode); 
    新的可运输式表空间 - innoDB为每个表产生一个.idb文件,现在,这个文件可以在物理存储设备和数据库服务器间自由传输;当创建一个新表,开发者可以在mysql数据空间外指定一个其他的路径来存储.idb文件。这可以将比较“hot”或者比较忙的表数据转移到外部的网络存储设备(SSD,HDD),这样不会对应用或者数据库的花销造成竞争。这个新功能还支持快速无缝的应用,允许用户方便地导出/导入InnoDB表 转移到其他正在运行的MySQL服务器。
    例子导出:
CREATE TABLE t(c1 INT) engine=InnoDB; 
FLUSH TABLE t FOR EXPORT; -- quiesce the table and create the meta data file 
$innodb_data_home_dir/test/t.cfg
UNLOCK TABLES; 
    相应的导入:
CREATE TABLE t(c1 INT) engine=InnoDB; -- if it doesn't already exist 
ALTER TABLE t DISCARD TABLESPACE; 
-- The user must stop all updates on the tables, prior to the IMPORT 
ALTER TABLE t IMPORT TABLESPACE;    

改进的复制和高可用性
    复制是最常用的mysql功能,经常表现在在扩展性和高可用性上(HA)。mysql5.6包含了新的功能,允许开发者为下一代网络、云计算、社交和移动应用程序和服务等建立自愈式的复制拓扑和高性能的主从集群。关键点包括:
    新的全局事务标识符(GTIDs) (介绍的不太懂,可自行google相关GTID的资料)- GTIDs来强化数据库的主备一致性,故障恢复,以及容错能力。允许跟踪复制事务完整性,实现的相关技术为复制主/从拓扑、提供一个可自愈的恢复点、以及允许DBA和开发者们更加容易的标示master失败后最新的那个slave。通过直接构建到二进制日志流中,GTID不在需要其他的第三方插件来提供这种级别的跟踪报告。
    新的mysql复制工具 - 一套新的python工具可以用来使用GTID来提供复制管理和监控的功能,它可以将失败的master关闭或者进行替换维护。这样,如果在没有操作员干预的情况下发生了计划内和计划外的停机事故,遍不在需要额外的第三方高可用性解决方案、保护性网络和云服务等。
    新的多线程slave - 基于模式的工作线程间的分割处理,允许可以并行的进行更新操作,不在是原先的顺序执行。这样为那些在数据库上对应用隔离的数据进行更新带来的好处。如,多租户系统:
测试显示,在一定的环境下,同时开启10个工作线程,性能提升5倍以上。
    新的二进制日志组提交(BGC) - 在mysql5.6中,对master群的复制以组的形式写进二进制文件中,而不再是一次性提交,显著的提高了master拓扑的性能。BGC同样支持了更好的细粒度锁,这样减少锁等待,再次增加了性能增益。效果如下:
在主服务器的吞吐量方面,mysql5.6的性能比5.5提升了180%。BGC很大程度的消除了那些用户不得不在master性能开销、扩展性、MySQL复制所提供高性能收益 之间进行的选择。
    新的基于行复制的优化 - mysql5.6提供了一个新的选项binlog-row-image=minimal,这个选项允许应用程序只能对行的镜像数据进行复制,而不在关心行是否已经进行了DML操作。这提高了主从机器的复制吞吐量,减少了二进制日志所占用的磁盘空间、网络资源和内存占用。
    新的事故安全slave - mysql5.6保存了基于表的二进制日志文件,这样从机器就可以自动回滚到上一次成功复制的版本,并且不再需要管理员介入。她不仅降低了运营开销,同样也降低了从数据库试图恢复损坏文件时所带来的磁盘数据丢失的风险。更进一步说,如果主服务器突然出现事故而造成了二进制文件的丢失,那么服务器可以自动恢复到当前可以正确读取的位置。
    新的复制效验和 - mysql5.6可以确保了正在复制到从服务器上的数据的完整性,方法是检测数据是否损坏,并且在从服务器数据损坏之前返回一个错误信息,从而防止从服务器本身被损坏。
    新的延时复制 - mysql5.6提供了一个保护措施,允许开发者在复制流中添加定义延迟,从而防止主服务器上产生的错误被传播到从服务器中。通过配置主到从之间的时间延迟,如果发生了故障或者事故,从服务器可以被提升为新的主服务器,方便了将数据库恢复到以前的状态。它同样可以 在错误和故障发生之前 检查一个数据库的状态,而不再需要重新加载一个备份。

改进性能模式
    在mysql5.5中就对mysql的性能模式做了介绍,他被设计用来味关键性能指标提供一个度量时间点。mysql5.6改善了性能模式,新的测试点包括:
    Statements/Stages - 我的哪些查询是最耗资源的?他们把时间花在哪儿?
    Table/Index I/O, Table Locks - 哪些应用的表或索引占用了大多数的负载?
    Users/Hosts/Accounts - 哪个应用程序的用户、主机和账号最占资源?
    Network I/O - 网络负载如何?session空闲了多久?

    mysql5.6现在在my.cnf文件中默认开启性能模式,同时默认开启的还有优化及自动修正设置,这样减少了开销,所以使用性能模式生产服务器来监控最常见应用程序的用例并不是太大的问题。另外,新的原子级别的测试能够捕获更加细粒度级别的资源消耗,比如用户、主机、账户、应用程序等等,特别 云计算环境中 用于支付和退款。
    mysql5.6在性能模式中有许多独创专利,其中的许多都已经发表在blog中,你可以参考其中技术和实用的细节。你可以从这里来阅读博客内容Mark Leith 和Marc Alff. 

其他一些性能的增强
    新的自动配置优化 - mysql5.6改变了原来的服务器默认配置,在当前的系统架构下支持更好的开箱即用性能。当更改大部分一般的配置时,这些新的默认配置将会减少前期准备所花费的时间。现在许多配置选项可以根据环境自动设置大小值,当服务器启动时也可人为的设置或更改。
    改进的TIME/TIMESTAMP/DATETIME数据类型:
  • TIME/TIMESTAMP/DATETIME - 现在支持了微妙级别的精度。
  • TIMESTAMP/DATETIME - 在5.5就已经支持了,允许开发者指定当前时间戳或者自动更新值或者两者同时作为TIMESTAMP和DATETIME的默认值。
  • TIMESTAMP -  现在默认值为空。当不再被指定值的时候,TIMESTAMP 列不再如原来一样自动获取DEFAULT NOW()或 ON UPDATE NOW() 的值,而是用空来替代。
    更好的条件处理 GET DIAGNOSTICS
    mysql5.6允许开发者更加容易去对错误和代码异常进行检查,通过使用新引入的mysql诊断区域和GET DIAGNOSTICS命令接口。诊断区域可以使用多个选项,提供以下两种信息:
  • 陈述- 它提供了受影响的行数和执行命令的数量;
  • 条件 - 返回所有执行条件的前一个操作所产生的错误代码和错误信息。
    新的GET DIAGNOSTICS命令为诊断区域提供了一个标准接口,通过CLI或者应用程序代码,可以轻松的检索和处理最近语句的执行结果:
mysql> DROP TABLE test.no_such_table; 
ERROR 1051 (42S02): Unknown table 'test.no_such_table' 
mysql> GET DIAGNOSTICS CONDITION 1 
-> @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT; 
mysql> SELECT @p1, @p2; 
+-------+------------------------------------+
| @p1 | @p2 | 
+-------+------------------------------------+
| 42S02 | Unknown table 'test.no_such_table' | 
+-------+------------------------------------+

Options for leveraging the MySQL Diagnostics Area are detailed here. You can learn more about GET DIAGNOSTICS here.   

    改进的ipv6支持
  • mysql5.6改进了INET_ATON() 来转换和存储基于字符串的IPv6地址,将其作为二进制数据进行存储,已达到最小空间消耗。
  • mysql5.6改变了绑定地址选项的默认值,从 “0.0.0.0”到“0::0”,这样MySQL服务器接受连接所有IPv4和IPv6地址。You can learn more here. 
    改进的分区
  • 提高分区的数量来提高表的性能 - mysql5.6现在在高度分区系统中进行执行和扩展,特别是insert操作,涉及到数百个分区。
  • 导入/导出 表 从/到 分区表 - mysql5.6允许用户交换表分区或者子分区,命令为ALTER TABLE ... EXCHANGE PARTITION,已经存在于原来的分区或者子分区中的行将会被转移去一个非分区表,相应的,任何存在于非分区表中的行也可以被转移到分区表或子分区表中。
  • 明确分区选择 - mysql5.6支持显式选择分区和子分区,当给定一个where条件时,将会对行进行上述检查。和自动分区类似,被检查的分区也是可被 指定/控制 的,都支持查询和大量的DML语句(SELECT, DELETE, INSERT, REPLACE, UPDATE, LOAD DATA, LOAD XML)。
    改进GIS:精确的空间操作 - mysql5.6通过精确的对象形状来几何操作提供支持,按照OpenGis的标准来对两个几何值之间的关系进行相应测试。

总结
    mysql5.5已经被称为是有史以来最好的mysql版本。mysql5.6在这基础上进行了改进,提高了性能、可伸缩性、可用性、事务吞吐量等,为了满足当下最苛刻的web、云以及嵌入式等各方面的需求。

http://www.liuyanglong.com/?p=187
原创粉丝点击