首页 数据库 mysql教程 Percona对MySQL标准版本的改进

Percona对MySQL标准版本的改进

Jun 07, 2016 pm 04:32 PM
mysql 内容 改进 标准 版本

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/percona_vs_mysql.html 周末有空读了下Percona XtraDB对MySQL InnoDB的改进点,这里给大家分享下。 一、对可

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/percona_vs_mysql.html

周末有空读了下Percona XtraDB对MySQL InnoDB的改进点,这里给大家分享下。

一、对可扩展性的改进:
1. 提升Buffer Pool的扩展性
InnoDB Buffer Pool一个众所周知的问题是大并发查询执行的争用,XtraDB将Buffer Pool的全局Mutex拆成了多个Mutex以减少争用。

2. 提高InnoDB IO扩展性
XtraDB增加了许多变量去调整IO到最佳状态,包括调整checkpoint、后台读写数据文件线程数等等的参数。

3. 多个回滚段
为提供一直读,InnoDB将事务修改的数据写到回滚段。回滚段被一个独立的Mutex保护,这直接导致了写密集型的工作并发不高。在 XtraDB可以改变回滚段的数目(innodb_extra_rsegments),在写密集型操作中可以大幅度提高性能。

4. 可以更高的并发数
InnoDB在回滚段只提供了1024个回滚槽(春哥就遇到过这个瓶颈),如果回滚槽用完,新的事务将不能开始,直到有回滚槽被释放。

二、性能上的提升
1. 专用的Purge线程
在InnoDB一个事务修改的数据被写到共享表空间的undo space,所以InnoDB能提供读一致。到一个事务结束了,undo space的相应区域被释放。但是如果有很多事务,Purge线程清理空间不够快,共享表空间将急剧增长(BRMMS共享表空间巨大应该是这个原因)。这 将导致性能严重下降,甚至可能用完所有的磁盘空间。XtraDB使用了一个专用的线程来清理undo space,这对undo space的清理速度可以提升很多。尽管这可能使整体的性能降低,但是可以大大提高稳定性,因而整体性能略微降低是值得的。

2. 可配置的Doublewrite缓冲
InnoDB使用了double write功能来防止数据损坏,double write的意思是,是写数据到文件前,先顺序写到到共享表空间。如果遇到一个损坏的写,InnoDB将使用这个buffer去恢复数据。尽管数据被写了 两次但对性能影响通常较小,但是在一些高负载环境,doublewrite就成了瓶颈。XtraDB提供了一个选项将doublewrite buffer放在一个独立的磁盘来提升并发性能。

3. Query Cache增强
Percona提供了额外的参数来配置Query Cache,例如忽略SQL中的注释性语句来检查是否可以命中。

4. Fast InnoDB Checksum
InnoDB可以checksum所有从磁盘上读取的页,以提供防止数据损坏的额外安全保障。在XtraDB中,Percona改进算了 checksum算法,可以提供更好的性能。

5. 删除过多的函数调用
当MySQL从socket读数据时,将产生很多fcntl(针对描述符提供控制的函数)调用,导致并发性能下降。Percona移出了多于 的调用。

6. 减少了Buffer Pool Mutex竞争
在InnoDB内核操作时减少了Buffer Pool之间的Mutex争用(拆分Mutex变量)

三、灵活性改进
1. 支持多种页大小
尽管InnoDB支持多种页大小,但是默认的页大小16K无法在不重新编译的情况下改变。XtraDB提供一个系统变量 (innodb_page_size)来改变这个值。更小的页大小可以提升大多数OLTP系统的工作性能,更大的页通常可以提供更好的 OLAP性能。

2. 禁止Replication警告
默认的基于Statement的复制,例如NOW(),RAND(),call存储过程/函数等一些语句,或者UPDATE没有ORDER BY而使用LIMIT,可能是不安全的。在这种情况下,MySQL会发出1592警告(声明语句在Statement日志下是不安全的)。不 幸的是,MySQL 5.1的一个Bug导致Server发出这个警告在一些安全的情况下。索然他不会导致任何与复制相关的问题,但是这会导致Error Log里面存在没必要的报警。这个改进可以避免这些警告。

3. 处理BLOB中的行结束符
Percona(5.1.x-12.x开始,5.1.x-11.x不支持)为MySQL客户端提供一个新的选项(no-remove- eol-carret)来处理Blob字段含r字符的情况。

4. 复制停止恢复
当使用sql_slave_skip_counter参数时,如果一个事件组的中间某条出错了,slave将跳过所有剩余的时间操作直到这个 事件组结束。表述比较困难,直接看Percona给的使用例子就明白了。
http://www.percona.com/docs/wiki/percona-server:features:replication_skip_single_statement

5. 可固定的预读区
在InnoDB中,预读(read-ahead区域)的大小是动态计算的,但是它经常是一个同样的值。XtraDB(5.1.x-12.x开 始,5.1.x-11.x不支持)可以让这个这个区域的大小固定,避免无用的计算。
这是Facebook放出的补丁:http://bazaar.launchpad.net/~mysqlatfacebook/mysqlatfacebook/5.1/revision/3538

四、可靠性的改进
1. Crash后同步日志
在InnoDB中,slave复制状态存储在两个不同步的文件中(relay.index和relay.info)。如果slave因为错误 状态而停止,文件将不同步,最后的事务将重新执行。Percona在XtraDB事务日志中增加了复制状态:当重启事务时,slave可以使 用这个信息来实现一致性。
来自Google的补丁:http://code.google.com/p/google-mysql-tools/wiki/TransactionalReplication
这个缺陷可能导致的Bug:http://bugs.mysql.com/bug.php?id=34058

2. Too Many Connections的警告
Percona将“Too Many Connections”这个警告写入Server端的error_log,而不只是客户端报这个错。

3. 错误代码的兼容性
Percona(5.1.x-12.x开始,5.1.x-11.x不支持)提供与MySQL 5.5错误代码的兼容性,避免因为升级到5.5而带来错误码不一样的问题。

4. 文件句柄损坏的表(InnoDB)
MySQL在InnoDB有表损坏之后,所有的InnoDB表都不可用。XtraDB改进了这一点,只是disable损坏的表,数据库依然 可以使用其他的表,损坏的表被锁定。

五、可管理性的提升
1. Fast InnoDB Recovery
InnoDB一直以来有个很麻烦的事情,在crash后回复InnoDB的表非常的缓慢。Percona/XtraDB因为是基于 InnoDB Plugin 1.0.8 的,也具备InnoDB Plugin快速恢复的功能。(早期的Percona版本也能看到XtraDB恢复速度比InnoDB快很多,因为XtraDB早期使用了自己开发的 Fast Revcovery)
一些测试:http://www.mysqlperformanceblog.com/2009/07/07/improving-innodb-recovery-time/

2. InnoDB 数据字段大小限制
InnoDB在自己的表缓存(Table Cache)中分配存储表定义(Table Definitions)的内存称为数据字典。默认情况下,一旦打开表,字典中表示它的内部对象将一直保存在内存中,直到表被删除或者服务器重启。如果存 在很多表(例如 10万张或更多,Dubbo就有这种情况,logstat库),可能导致消耗巨大的内存有时可能达到G级别。Percona修改了这种策略,可以设置参数 (innodb_dict_size_limit)来限制数据字典的大小,使InnoDB使用LRU算法来限制数据字典大小,而不是一直存在 内存中,避免因为表太多而内存耗尽。

3. 展开表导入
InnoDB不像MyISAM那样可以在服务器之间拷贝单表定义文件。如果配合Xtrabackup导出,一张表可以在另一个XtraDB导 入。

4. Buffer Pool使用共享内存
当Buffer Pool非常大时,重启后Warn up需要大量磁盘读写,这会消耗很多时间。通过将Buffer Pool存储在Shared Memory中,这些非是耗时的IO将会节省掉。主机重启就没办法了,得用下面的功能。

5. 导出/恢复Buffer Pool
对于使用了很大Buffer Pool的InnoDB,重启数据库很痛苦。通常需要InnoDB Buffer Pool先Warn Up再提供服务,这可能需要很久。XtraDB(5.1.x-12.x开始,5.1.x-11.x不支持)提供了命令可以把Buffer Pool的内容导入或导出,从而可以提高重启提供服务的速度。
使用方法:http://www.percona.com/docs/wiki/percona-server:features:innodb_lru_dump_restore?redirect=1

6. Fast Index Creation
快速索引创建是InnoDB Plugin的功能,只要不是主键变动,修改索引的速度比之前快很多。但是在一些场景下,这可能导致损坏。XtraDB提供参数 (innodb_fast_index_creation)来选择Fast Index Creation功能是否启用,如果关闭,则使用原来的创建方法。

7. Fast Index Renaming
XtraDB((5.1.x-12.x开始,5.1.x-11.x不支持))扩展了ALTER TABLE命令,提供在线重命名索引功能,这样不会导致重建索引。(这对我们调整不规范索引名称非常有用)

8. 防止缓存Flashcache
Flashcache通过在SSD上缓存数据来提升性能。它工作时应该让更热的数据缓存才能能提高更好的性能,XtraDB提供了注释提示来 忽略不必缓存的数据。

六、诊断问题方面的提升
1. 额外的INFORMATION_SCHEMA表
Percona/XtraDB提供额外的INFORMATION_SCHEMA表以获得数据库内部更详尽的信息,例如内部缓冲池的内容或统计 信息。

2. 慢查日志扩展
Percona提供了额外的统计数据,可以通过参数启用。它可以帮助我们捕捉需要的事件尽可能详细的信息,简化了慢查分析的难度。

3. InnoDB状态显示
XtraDB整理了InnoDB Status的显示量,提供更好的可读性,状态由24个上升到48个,并且打印了被内部哈希表使用的内存量。通过新的参数可以配置的输出。

4. 计算InnoDB死锁数
当运行一饿事务性的应用程序,总会不同程度的出现死锁,只要不经常出现这并不是大的问题。InnoDB中Show InnoDB Status命令只给出了最后一次死锁额信息,当我们需要知道总的死锁数或一个单位时间的死锁量这里并不能给出。XtraDB增加了一个保存死锁量的状态 变量,通过这个变量可以更好的了解我们数据库上发生的死锁。

5. 可以记录所有Server端命令(syslog)
Percona可以在syslog中记录所有运行在Server端的命令。

6. 响应时间分布
Percona提供了一份报告表明在一定间隔内在服务器上执行Query数。这个信息可以用于监控数据库性能是否稳定。

7. Show Storage Engines
Percona改变了Show Storage Egnines的输出,以表名XtraDB是不是启用。(以前XtraDB也使用InnoDB的名称输出)

8. Query Cache Mutex状态
Query Cache可能导致一些很难被检测出来的问题,Percona修改了show processlist命令,可以输出“Waiting on query cache mutex”状态。

9. 显示锁名称
“show mutex status”命令可以显示当前发生的锁定名称和os_wait值。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1274
29
C# 教程
1256
24
laravel入门实例 laravel入门实例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是强大的数据库管理工具。1)MySQL用于创建数据库和表、执行DML和SQL查询。2)phpMyAdmin提供直观界面进行数据库管理、表结构管理、数据操作和用户权限管理。

MySQL与其他编程语言:一种比较 MySQL与其他编程语言:一种比较 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。 MySQL以其高性能、可扩展性和跨平台支持着称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

laravel框架安装方法 laravel框架安装方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了详细分步说明,指导读者如何轻松安装 Laravel 框架。Laravel 是一个功能强大的 PHP 框架,它 упростил 和加快了 web 应用程序的开发过程。本教程涵盖了从系统要求到配置数据库和设置路由等各个方面的安装过程。通过遵循这些步骤,读者可以快速高效地为他们的 Laravel 项目打下坚实的基础。

在MySQL中解释外键的目的。 在MySQL中解释外键的目的。 Apr 25, 2025 am 12:17 AM

在MySQL中,外键的作用是建立表与表之间的关系,确保数据的一致性和完整性。外键通过引用完整性检查和级联操作维护数据的有效性,使用时需注意性能优化和避免常见错误。

比较和对比Mysql和Mariadb。 比较和对比Mysql和Mariadb。 Apr 26, 2025 am 12:08 AM

MySQL和MariaDB的主要区别在于性能、功能和许可证:1.MySQL由Oracle开发,MariaDB是其分支。2.MariaDB在高负载环境中性能可能更好。3.MariaDB提供了更多的存储引擎和功能。4.MySQL采用双重许可证,MariaDB完全开源。选择时应考虑现有基础设施、性能需求、功能需求和许可证成本。

yi框架用什么软件比较好 yi框架使用软件推荐 yi框架用什么软件比较好 yi框架使用软件推荐 Apr 18, 2025 pm 11:03 PM

文章首段摘要:在选择开发 Yi 框架应用程序的软件时,需要考虑多个因素。虽然原生移动应用程序开发工具(如 XCode 和 Android Studio)可以提供强大的控制和灵活性,但跨平台框架(如 React Native 和 Flutter)凭借其编写一次,即可部署到多个平台的优点而越来越受欢迎。对于刚接触移动开发的开发者,低代码或无代码平台(如 AppSheet 和 Glide)可以快速轻松地构建应用程序。另外,云服务提供商(如 AWS Amplify 和 Firebase)提供了全面的工具

SQL与MySQL:澄清两者之间的关系 SQL与MySQL:澄清两者之间的关系 Apr 24, 2025 am 12:02 AM

SQL是一种用于管理关系数据库的标准语言,而MySQL是一个使用SQL的数据库管理系统。SQL定义了与数据库交互的方式,包括CRUD操作,而MySQL实现了SQL标准并提供了额外的功能,如存储过程和触发器。

See all articles