1、背景
InnoDB引擎存储int类型时使用big-endian, 而MySQL使用litter-endian, 导致一个问题是在两个层之间拷贝int类型数据的时候必须用一个循环来处理,而不能直接memcpy。 在引擎层返回数据量很大的情况下,很耗cpu。
在报表类的一些查询中,会访问大量的数据。我们有个项目的一个查询需要访问到1.4w个bigint,这个时候cpu的消耗就体现出来了。
2、相关代码
目前使用的转换代码就是使用循环。
row_sel_field_store_in_mysql_format这个函数的作用是把数据从InnoDB格式转成MySQL格式,
如下:
ptr = dest + len;
for (;;) {
ptr--;
*ptr = *data;
if (ptr == dest) {
break;
}
data++;
}
|
这里如果是bigint就需要循环8次。
反过来的转换代码在row_mysql_store_col_in_innobase_format,也是类似的需要一个循环。
3、改进和效果
这一坨循环,O3编译以后的汇编代码下,如果是bigint,需要40条指令。而显然我们使用的时候,int和bigint会很多。
因此考虑当len=4或8的时候,使用bswap和bswapq实现。
修改后再用oprofile观察上面说到的一个统计查询压力下的结果,发现row_sel_field_store_in_mysql_format这个函数cpu占用率从50%下降到44%.
DB的多数情况下压力还是在io,因此这个改进的效果需要在特定场景下才能体现。 最近跟Oracle InnoDB工程师讨论的时候了解到会有一些专门针对减少汇编结果做的优化,就凑热闹把这个提了。
Patch内容: http://bugs.mysql.com/file.php?id=18018&text=1 基于5.5.22
分享到:
相关推荐
InnoDB文件格式管理是MySQL数据库管理中的一个重要组成部分,特别是在数据迁移、版本升级或回滚等场景下显得尤为重要。随着MySQL版本的演进,InnoDB存储引擎的数据文件格式已经发生了变化,以适应新特性,并提供更好...
利用MySQL性能监控工具如SHOW STATUS、SHOW VARIABLES、SHOW ENGINE INNODB STATUS等,监控InnoDB的运行状态,及时发现和解决问题。 总结,MySQL的InnoDB存储引擎在提供强大功能的同时,也带来了丰富的优化可能性...
MySQL InnoDB Java阅读器 innodb-java-reader是一个Java实现,用于直接访问MySQL InnoDB存储引擎文件。 使用库或命令行工具,它提供了只读功能,例如检查页面,通过主键,辅助键查找记录以及通过LSN或填充率生成页面...
Set up and use InnoDB Cluster as an HA solution Migrate your existing servers to MySQL 8 Employ best practices for using InnoDB Cluster Configure servers for optimal automatic failover to ensure ...
《Innodb架构、性能优化》是一份深入探讨MySQL数据库InnoDB存储引擎的文档,主要关注其架构设计和性能调优策略。InnoDB是MySQL中最常用的存储引擎,尤其在处理事务性和复杂查询方面表现出色。以下是对InnoDB核心概念...
yum install make gcc flex bison cd /root/undrop-for-innodb-master make 会产生三个文件c_parser innochecksum_changer stream_parser
percona-data-recovery-tool-for-innodb-0.5.tar.tar
XtraDB是Percona公司基于Innodb开发的增强版本,引入了额外的性能优化和特性。 从描述和部分内容来看,彼得·扎伊特塞夫(Peter Zaitsev)在2011年O'Reilly MySQL Conference and Expo上进行了主题演讲。他讨论了...
本篇文章将深入探讨InnoDB存储引擎中的索引大小问题,包括其影响因素、限制以及优化策略。 首先,我们来了解InnoDB索引的基本结构。InnoDB主要使用B+树(B-tree)作为索引的数据结构,无论是主键索引还是辅助索引。...
MySQL技术内幕InnoDB存储引擎-读书笔记.pdf
随着MySQL 5.1版本的推出,InnoDB可以作为一个插件进行版本更换,而在MySQL 5.5版本中,InnoDB插件版本1.1包含了性能和可扩展性的尖端改进,能够满足用户对于高效、稳定数据库管理系统的追求。 在本用户指南中,...
InnoDB是MySQL数据库管理系统中的一个核心存储引擎,以其强大的事务处理能力和稳定性而闻名。对于高并发、大数据量的应用场景,优化InnoDB的性能参数至关重要。以下是对InnoDB性能优化参数的详细解析: 1. **innodb...
5. `innodb_read_io_threads` 和 `innodb_write_io_threads` 分别设为 16,以优化 I/O 并发。 6. `innodb_io_capacity` 设为 2000,表示磁盘的理论 I/O 能力。 7. `innodb_log_files_in_group`、`innodb_flush_log_...
InnoDB is the most commonly used storage engine for MySQL and Percona Server and is the focus for majority of storage engine development by MySQL and Percona Server teams. In this tutorial, we will ...
MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月
- InnoDB 引擎层面的性能优化和功能增强。 - Server 层面的性能优化和功能增强。 #### InnoDB 层新特性 InnoDB 是 MySQL 最常用的存储引擎之一,在 MySQL 5.6 中得到了显著的增强,特别是在性能和功能方面。 ##...
而UPDATE操作则会执行一个相反方向的UPDATE,以逻辑方式还原数据。此外,undo log还用于实现MVCC,记录数据的历史版本,但这些版本仅服务于InnoDB自身的事务执行,不会永久保存。 与etcd的MVCC实现相比,尽管两者都...
为了更好地理解和分析查询优化过程,首先我们需要准备一个测试环境。本例使用的是 MySQL 5.1.49-debug-log 版本,InnoDB 存储引擎。 表结构定义如下: ```sql CREATE TABLE `nkeys` ( `c1` int(11) NOT NULL, `c2...