MySQL性能比较测试:MySQL5.6 GA -VS- MySQL5.5

MySQL 5.6 GA 发布了,毫无疑问,这是 MySQL 最棒的一个版本。如果你还不清楚 MySQL 5.6 版本一长串的新特性和改进内容,可以从 这里 获得了解。而我这篇文章的主要目的则是性能的测试。

我使用 Sysbench workloads (Read-Only/Read-Write) 来测试。下面是我的测试环境:

硬件配置:

  • 服务器 : 32核 bi-thread (HT) Intel 2300Mhz, 128GB RAM
  • 操作系统 : Oracle Linux 6.2
  • 文件系统 : XFS mounted with "noatime,nodiratime,nobarrier,logbufs=8"
  • MySQL : 5.6-GA, latest 5.5

MySQL 配置

<span class="com" style="color: rgb(136, 0, 0); ">#--------------------------------------------------</span><span class="pln" style="color: rgb(0, 0, 0); ">
 max_connections </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">4000</span><span class="pln" style="color: rgb(0, 0, 0); ">

 key_buffer_size </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">200M</span><span class="pln" style="color: rgb(0, 0, 0); ">
 low_priority_updates </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">1</span><span class="pln" style="color: rgb(0, 0, 0); ">
 sort_buffer_size </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">2097152</span><span class="pln" style="color: rgb(0, 0, 0); ">
 back_log </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">1500</span><span class="pln" style="color: rgb(0, 0, 0); ">
 query_cache_type </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pln" style="color: rgb(0, 0, 0); ">

</span><span class="com" style="color: rgb(136, 0, 0); "># files</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_file_per_table
 innodb_log_file_size </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">1024M</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_log_files_in_group </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">3</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_open_files </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">4000</span><span class="pln" style="color: rgb(0, 0, 0); ">
 table_open_cache </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">8000</span><span class="pln" style="color: rgb(0, 0, 0); ">
 table_open_cache_instances </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">16</span><span class="pln" style="color: rgb(0, 0, 0); ">

</span><span class="com" style="color: rgb(136, 0, 0); "># buffers</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_buffer_pool_size </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">32000M</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_buffer_pool_instances </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">32</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_log_buffer_size </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">64M</span><span class="pln" style="color: rgb(0, 0, 0); ">
 join_buffer_size </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">32K</span><span class="pln" style="color: rgb(0, 0, 0); ">
 sort_buffer_size </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">32K</span><span class="pln" style="color: rgb(0, 0, 0); ">

</span><span class="com" style="color: rgb(136, 0, 0); "># tune</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_checksums </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_doublewrite </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_support_xa </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_thread_concurrency </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_flush_log_at_trx_commit </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">2</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_flush_method </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> O_DIRECT
 innodb_max_dirty_pages_pct </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">50</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_use_native_aio </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="lit" style="color: rgb(0, 102, 102); ">1</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_stats_persistent </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">1</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_spin_wait_delay </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">6</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="pun" style="color: rgb(102, 102, 0); ">/</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">96</span><span class="pln" style="color: rgb(0, 0, 0); ">

</span><span class="com" style="color: rgb(136, 0, 0); "># perf special</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_adaptive_flushing </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">1</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_flush_neighbors </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_read_io_threads </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">16</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_write_io_threads </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">4</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_io_capacity </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">2000</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_purge_threads </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="lit" style="color: rgb(0, 102, 102); ">1</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_adaptive_hash_index </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); ">  </span><span class="lit" style="color: rgb(0, 102, 102); ">1</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="pun" style="color: rgb(102, 102, 0); ">/</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pln" style="color: rgb(0, 0, 0); ">

</span><span class="com" style="color: rgb(136, 0, 0); "># Monitoring</span><span class="pln" style="color: rgb(0, 0, 0); ">
 innodb_monitor_enable </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="str" style="color: rgb(0, 136, 0); ">'%'</span><span class="pln" style="color: rgb(0, 0, 0); ">
 performance_schema </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> ON
 performance_schema_instrument </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln" style="color: rgb(0, 0, 0); "> </span><span class="str" style="color: rgb(0, 136, 0); ">'%=on'</span><span class="pln" style="color: rgb(0, 0, 0); ">
</span><span class="com" style="color: rgb(136, 0, 0); ">#--------------------------------------------------</span>

MySQL 调整

  • 配置最主要的不同是 AHI (innodb_adaptive_hash_index) 和 Spin Delay (innodb_spin_wait_delay) -- 而其他的部分在这个测试过程中基本上已经足够好了。
  • 关于 AHI 的影响我之前已经写了很多文章。AHI 主要的困境在于“用还是不用”,在很多情况下它可以帮助因为锁导致的堵塞并加快索引的访问,但在高并发的情况下可能会因为其 btr_search_latch 导致 rw锁争用导致的瓶颈
  • 在 MySQL 5.6 中的 Spin Delay 设置需要特别的注意,因为它在管理内部互斥量和 rw 锁争用时扮演非常重要的角色,利用它可能会让你轻松的将性能提升一倍。(你可以通过 这里 来了解详情,但你应该知道,没有银弹,也没有什么固定的最优值是适合各种不同的环境,这个完全依赖于你的系统负载。因此其默认值跟 MySQL 5.5 一样都是 6)。
  • 因此,在我的测试中,我非常好奇想了解在不同的负载情况下最佳的 AHI 和 Spin Delay 设置的配置对。
  • 接下来要记住 MySQL 5.5 和 5.6 在可伸缩性方面的限制。我在 8、16、32 和 64 核的情况下重新进行测试(64核相当于开启和超线程的32核机器,其他的都没有开启超线程)

首先向你展示第一个有趣的比较,为了跟我以前的测试保持“兼容性”,我首先测试了 TPS (事务/秒),然后再是 QPS (查询/秒) ,我更喜欢这种方式。

首个测试是经典的 Sysbench OLTP_RO (只读):

Sysbench OLTP_RO :

接下来是同一个 OLTP_RO 测试,但在事务中不进行表的打开和关闭操作 (完整的解释请看 这里 )

Sysbench OLTP_RO-trx :

接下来是 "point-selects" ,这是一种读数据的方式,在以前的 MySQL 5.5 版本表现良好,但在 5.6 仍有一些不同。

Sysbench OLTP_RO Point-Selects :

这是最痛苦的测试,Simple-Ranges (你可以阅读 此文 了解为什么痛苦和令人沮丧)

Sysbench OLTP_RO Simple-Ranges :


 

下面是读写测试,这还不是负载最重的读写,但仍可说明问题:

Sysbench OLTP_RW : 

TPS 从 256 个并发用户时就开始下降,期待这个有更高的水平。但仍然比 5.5 版本要高出 2 倍,相信我,下一个版本的 MySQL 表现会更好。这个阶段可通过调整 innodb 线程并发设置来得到更稳定和更高性能。

我很高兴的看到 MySQL 5.6 GA 发布,因为:

  • 这是 MySQL 史上最棒的版本
  • 在高负载下比 MySQL 5.5 快很多
  • 更好的设计
  • 更具可调节性
  • 性能分析更透明
  • 更好的仪表化
  • 这些方式比你以往看到的都要好
  • 包含很多新特性

因此,我唯一的问题是:你什么时候开始测试 MySQL 5.6 并制定 数据库 移植计划?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值