InnoDB big-end问题和一个小优化

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL 关系型数据库 MySQL
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
|
存储 Oracle 关系型数据库
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
120 0
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
|
SQL 关系型数据库 MySQL
MySQL 5.7下InnoDB对COUNT(*)的优化
MySQL 5.7下InnoDB对COUNT(*)的优化
167 0
MySQL 5.7下InnoDB对COUNT(*)的优化
|
SQL 关系型数据库 MySQL
MySQL 5.7下InnoDB对COUNT(*)的优化
MySQL 5.7下InnoDB对COUNT(*)的优化
MySQL 5.7下InnoDB对COUNT(*)的优化
|
SQL 关系型数据库 MySQL
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
|
存储 Oracle 关系型数据库
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
|
关系型数据库 数据库 索引
InnoDB btree latch 优化历程
(一般在数据库里面latch 指的是物理Lock, Lock 指的是事务的逻辑lock, 这里混用) 在InnoDB 的实现中, btree 主要有两种lock: index lock 和 page lock index lock 就是整个Index 的lock, 具体在代码里面就是 dict_index->lock page lock 就是我们在btree 里面每一
632 0
|
存储 关系型数据库 MySQL
MySQL优化系列(五)--数据库存储引擎(主要分析对比InnoDB和MyISAM以及讲述Mrg_Myisam分表)
MySQL优化系列(五)--数据库存储引擎(主要分析对比InnoDB和MyISAM以及讲述Mrg_Myisam分表) 之前一直是使用默认MySQL的InnoDB存储引擎,没有思考过为什么使用,也没思考过其优缺和其他数据库存储引擎。
2265 0
|
存储 关系型数据库 数据库
「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)
上一篇我们讲了关于视图应用与优化,本篇我们讲解内存优化。本篇短小精悍,通俗易懂。 注意:以下都是在MySQL目录下的my.ini文件中改写。