Percona对MySQL标准版本的改进

2024-02-21 14:18

本文主要是介绍Percona对MySQL标准版本的改进,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

from: http://home.51.com/m4885677/diary/item/10047184.html


一、对可扩展性的改进: 
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值。

这篇关于Percona对MySQL标准版本的改进的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/732064

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC