您的位置:首页 > 数据库 > MySQL

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

2013-02-25 10:42 281 查看
前言:抛个砖,引堆玉。对mysql5.6新特性进行了简单的翻译,主要目的是强迫自己耐性子看完5.6的说明,翻译中估计很多地方都是自己能看懂大家显迷茫,如觉得理解不了,请自行对照原文理解,欢迎更正。每更正完一点请再次与大家分享。

随着mysql5.6 即将在未来几天内公布其生产GA版,很有必要来总结下它的一些关键特性,从而能解释下为什么mysql5.6版本被称为是最好的发布版。简单来说,mysql5.6在数据库内核方面为几乎每个功能点都做了提升,包括了:

为 零顾虑的应用程序部署 提高了安全性;
更好的性能和可伸缩性

改进了InnoDB引擎使其增加了事务吞吐量;
改进了优化器能更好的检查query的执行时间和效率;

在DDL/Schema方面提供了更好的可用性;
为InnoDB提供了Memcache Api的Nosql支持;
改进了 高性能、分布式部署下的 响应情况;
提供了更好的性能可视化分析;
其他一些重要的增强;

为 零顾虑的应用程序部署 提高了安全性

安全是每个DBA和系统管理员首要关心的问题。出于这种考虑,Mysql5.6介绍了一种全新的方法来对密码进行内部的处理和加密。这个新的选项和特点包括:

在master.info中新的替代密码 - mysql5.6扩展了命令START SLAVE,允许DBA们指定超级用户和密码作为slave选项的一部分。为了验证这个指定的超级用户和密码,之前的版本往往需要一个外部身份验证插件(用户指定或者 mysql企业版提供)连接到主服务器 来做这项操作。有了现在的这个选项就不需要将这些信息暴露在master.info这样没有加密过的纯文本中了。
在一般查询日志、慢速查询日志 和 二进制日志中,对密码采用了新的加密方式 - 当密码在语句中写入上述这些日志时不再是纯文本的方式。
对密码进行新的hash散列 - 在原来的mysql内部中是通过PASSWORD()对密码进行加密散列,现在则是通过SHA-256散列算法用一个随机值对密码进行散列加密。
在命令行对密码提供了新的选项 - Mysql5.6 提供了一个‘scrambled’选项/配置文件(.mylogin.cnf)用来安全的存储用户密码,而不用像之前一样直接在命令行中输入明文密码。
在下次登录时更新密码 - DBA和开发者可以在mysql.user表中操作一个flag标示,用来控制账户密码何时更换为新密码。
基于密码生效的新策略 - 现在可以根据 适当的强度、长度、混合度、是否有特殊字符以及一些其他用户定义的策略来将密码定义为LOW, MEDIUM 以及STRONG。

可以到 http://dev.mysql.com/doc/refman/5.6/en/mysql-nutshell.html 查看更多内容。

更好的性能和可伸缩性:改进的InnoDB引擎
从操作系统的立场来看,MYSQL5.6提供了更好的持续的线性性能、在多处理器系统上更大规模的运行 以及 更高的cpu并发。这些的关键点是提升了InnoDB存储引擎的效率和并发性,移除了原先在InnoDB核心中的遗留线程征用和互斥锁。这些提升使得mysql可以在x86基础上,充分的开发更加先进的多线程处理能力。
内部测试数据显示,相对于现在的版本mysql5.5,Read/write和readonly方面都有了明显的进步。下图展示了mysql5.6在48个并发线程的情况下,read/write的TPS数据情况:



以及readonly的TPS数据情况:



更好的事务吞吐量:
mysql5.6在高并发、事务和读密集型工作负载方面 为 innoDB提升了更好的性能和可扩展性。在这些情况中,最好的衡量标准是 一个应用程序的执行和扩展为并发用户工作负载增长的性能。为了支持这些例子,innoDB提供了一个新的重构体系结构,为底层数据提供了最小化互斥锁、瓶颈、更加一致的访问路径等等。这方面的改进包括了:

内核互斥分裂,移除了单一节点的竞争
新线程刷新操作
新的多线程清理
新的自适应hash算法
更少的缓冲池竞争
更好更一致的查询执行

这些改进的最终结果测试基准展示如下:



在linux下,mysql5.6比mysql5.5提升了150%的TPS吞吐量。在windows2008环境下做类似的测试同样有47%的性能提升。

更好的read only 工作负载吞吐量:
已经为innoDB的read only处理性能做了提升,这样极大的提升了高并发下基于web的查询和生成报告应用程序的性能。这些优化绕开了事务处理的花销,当autocommit=1时,这些优化项也是默认启动的,或者可以由开发者手动开启,相关命令为:START_TRANSACTION_READ_ONLY。例子如:

SET autocommit = 0;
START_TRANSACTION_READ_ONLY;
SELECT c FROM T1 WHERE id=N;
COMMIT;

优化后的性能对比如下:



在linux下,mysql5.6比mysql5.5提升了230%的TPS吞吐量。在windows2008环境下做类似的测试同样有65%的性能提升。

再此上下文中所有的性能分析对比测试都是在如下的环境中进行:

Oracle Linux 6
Intel(R) Xeon(R) E7540 x86_64
MySQL leveraging:

48 of 96 available CPU threads
2 GHz, 512GB RAM

在使用固态硬盘(SSD)的情况下有更好的性能:
普通的旋转磁盘对任何系统来说都可能是最普遍的瓶颈所在,只因为他们的机械零件物理性的限制了并发性能的增长。因此,许多MYSQL应用正在逐步部署在SSD中,使其拥有了内存般的速度和稳定性,并且今天的网络系统支持最高水平的并发性能。处于这种考虑,mysql5.6为使用SSD而专门增加了一些关键的性能增强设计,包括了:

对4k、8k大小的page提供支持,从而能更好的使用SSD的标准存储算法。
可移植的.ibd文件(innoDB数据),这样使“hot”的innoDB表更加容易从默认数据目录转移到SSD或者网络存储设备。
为innoDB的undo log日志提供了单独的表空间,这样使undo log可以从当前系统表空间中转移到其他一个或多个表空间。为undo log设计的这种读密集型的io模式 允许这些新的表空间更容易转移到SSD中,同时也可以保证系统表空间同时存储于硬盘中。

更好的查询时间和检测:改进优化控制器
mysql5.6的优化器已经做了重构以达到更好的性能和效率,为更好的查询执行时间和诊断提供了一种改进的功能设置,5.6版本关键性的改进点包括了:
子查询最优化 - 使用半链接和实体化,mysql优化器大大提高了子查询的性能,从而简化了开发者对query的构建工作。特别的,优化器现在能更加高效的处理子查询中的from语句;from语句中的实体化只有在执行的过程中需要时才会进行,极大的提高了性能。此外,优化器可以在执行期间为派生表增加索引,从而来加快行检索。以下是一个测试的例子,和之前的版本比起来,提升了不止一个数量级(从天到秒!!):
select c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, sum(l_quantity)

from customer, orders, lineitem

where o_orderkey in (

select l_orderkey

from lineitem

group by l_orderkey

having sum(l_quantity) > 313

)
and c_custkey = o_custkey
and o_orderkey = l_orderkey

group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice

order by o_totalprice desc, o_orderdate

LIMIT 100;

文件排序优化 - 如果查询中有order by 和 小值的limit,优化器将会使用单一表扫描来产生一个有序的结果集。如下面的语句:

SELECT col1, ... FROM t1 ... ORDER BY name LIMIT 10;
内部标准测试显示,查询时间提升至少四倍,这样有助于提高整体用户体验和相应时间。

Index Condition Pushdown (ICP) - 默认情况下,优化器现在将where语句推到引擎层处做分析过滤,将表扫描后产生的结果集数据返回给mysql server。
CREATE TABLE person (

personid INTEGER PRIMARY KEY,

firstname CHAR(20),

lastname CHAR(20),

postalcode INTEGER,

age INTEGER,

address CHAR(50),

KEY k1 (postalcode,age)‏

) ENGINE=InnoDB;

SELECT lastname, firstname FROM person

WHERE postalcode BETWEEN 5000 AND 5500 AND age BETWEEN 21 AND 22;
内部标准测试显示,使用ICP,针对上面这个表的查询执行时间提升至少15倍。

批量键存取(BKA) & 多量程读(MRR) - 优化器现在允许存储引擎批量使用主键,并且允许存储引擎访问、排序、返回数据变得更有效率,大大的提高了查询执行效率。



BKA和MRR一起使用时查询效率提升了280倍。



更好的优化诊断 - mysql5.6的优化器提供了更好的诊断和调试,具体有:

EXPLAIN对INSERT, UPDATE, and DELETE提供了支持;
EXPLAIN打算使用json作为输出,从而达到更精准的优化指标和更好的可读性;
提供优化的痕迹, 便于跟踪优化决策过程。

http://www.liuyanglong.com/?p=184
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: