日期:2014-05-16 浏览次数:20596 次
?
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,也是类似的需