日期:2014-05-16  浏览次数:20596 次

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

?

1、背景

? InnoDB引擎存储int类型时使用big-endian, MySQL使用litter-endian, 导致一个问题是在两个层之间拷贝int类型数据的时候必须用一个循环来处理,而不能直接memcpy 在引擎层返回数据量很大的情况下,很耗cpu

?

?????? 在报表类的一些查询中,会访问大量的数据。我们有个项目的一个查询需要访问到1.4wbigint,这个时候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,也是类似的需