我们知道BDB是一种嵌入式的数据库,存取效率比mysql高,但是管理起来没有mysql方便,在分布式应用中同步也是一个问题。

恰好mysql是支持用BDB作为存储引擎的(5.1之后就不直接支持了,因为BDB被oracle收购了),那么能不能让mysql来进行数据管理和同步,而实际应用则绕过mysql直接访问BDB文件呢?

尝试了一下:

首先取得mysql 5.0源代码,按如下参数配置

./configure --with-berkeley-db=./bdb

编译之后启动mysql,建表时加上engine=bdb

此时在mysql的数据目录中可以看见*.db文件了。

用file命令查看,发现文件格式是Berkeley DB (Btree, version 9, native byte-order)

如果用db_dump命令查看,可以发现它与普通的db文件有两处不同:

1. 一般的db文件一个文件中只有一个库,而mysql则生成了两个库,main和status库(如果建表时加了主键之外的索引,则还会生成额外的索引库)

2. mysql生成的db文件,是以表的主索引作为key,用表的整行数据作为value,尤其对于char和varchar的列类型,mysql存储时会在字符串前面加上字符长度。例如"abc"被存储为"\x03abc"

对于第一点,可以在dbopen的时候指定一下库名,对于mysql生成的db文件,库名指定为"main"就可以了。

对于第二点,在查询时,需要把待查的key前面加上一个字符串长度,查出结果后,再把结果中的长度信息剥离。

这里面仍然存在一些问题,就是表结构的定义并不在db文件中,而在mysql生成的.frm文件里。所以首先你不知道如何拆分字段,其次你不知道表长度的字节是1个字节还是两个字节或者更多。不过这个可以通过约定的方式解决,双方约定好固定的表格式,可以将就一下。

但是更棘手的问题来了,做好这些改动后,发现查询某些键值时,能查到结果,而某些键值就查不到结果。

原来,问题还是出在字符串前面的长度字节上。一般来说,bdb的应用都使用字符串作为key,但是mysql存储的时候,在字符串前面加了一个字节,这就导致了自定义比较函数的问题。

前面说了,文件格式采用了Btree,那么在插入一个key的时候,是会和根节点比较大小,然后决定去哪一个子树。但是标准的比较大小是逐字节的比较,而在字符串前面加上长度字节后,相当于同长度的字符串会被划到一棵子树上去,也许mysql觉得这样影响检索效率,因此mysql通过自定义的比较函数,在比较字符串时把长度字节去掉之后再比较。而使用标准的DBD的接口,它却是按照标准的比较方式,自然会在很多情况下查找不到。

目前还没有想到合适的解决方法,尝试中……

--------------------------------------------

问题解决了,在bdb打开文件之前,设置一个自定义的比较函数(DB->set_bt_compare),在比较函数中跳过第一个字节,然后调用strncmp比较剩下的就行了。

至此圆满解决直接访问mysql存储引擎问题。

分享到:

2009-11-30 11:23

浏览 599

评论

mysql BDB存储引擎_直接访问mysql的BDB存储引擎相关推荐

  1. mysql+如何开发存储引擎_干货!MySQL 的 InnoDB 存储引擎是怎么设计的?

    MySQL 里还有什么其他成员呢? 对于 MySQL,要记住.或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图: 遇到问题,或者学习到新知识点时,就 ...

  2. mysql 储存引擎_详解mysql存储引擎的标准

    浅谈选择mysql存储引擎的标准 主要存储引擎的介绍 1.InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务.除非有非常特别的原因 ...

  3. mysql查看现在使用的引擎_如何查看MySQL的当前存储引擎?

    如何查看MySQL的当前存储引擎? 一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你 ...

  4. sphinx mysql存储引擎_基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计...

    Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级).Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在5 ...

  5. mysql怎么换引擎_如何更换MySQL默认存储引擎

    查看MySQL默认存储引擎 登录MySQL服务器,运行show engines命令: mysql> show engines; +------------+---------+--------- ...

  6. mysql innodb博客_细聊MySQL的Innodb存储引擎(完)

    上篇主要和大家探讨了Innodb引擎中出现幻读的处理方法与死锁的探测及避免死锁的一些注意事项.此篇,我们来研究下Innodb的索引. Innodb里涉及到的索引主要有四种,分别为聚簇索引(Cluste ...

  7. mysql innodb 锁类型_详细介绍MySQL InnoDB存储引擎各种不同类型的锁

    本文中,我们详细介绍MySQLInnoDB存储引擎各种不同类型的锁,以及不同SQL语句分别会加什么样的锁. 阅读提示 1.本文所参考的MySQL文档版本是8.0,做实验的MySQL版本是8.0.13 ...

  8. mysql中char存储中文_数据库中的字符类型存储字符和汉字的数量

    sqlServer2012(936 简体中文GBK )为例: 例如: varchar(10),只能存储10个英文字符或数字,也只能存储5个汉字: char(10),只能存储10个英文字符或数字,也只能 ...

  9. 防火墙导致mysql登录不上_防火墙导致MySQL无法访问的问题解决案例

    问题 数据库总是访问不了以致不得不反反复复的重启MySQL数据库. 但是重启的效果并不明显,重启10几分钟后问题依然出现.导致前端用户难以正常访问网站. 另外他们还通过google,百度搜索,怀疑是数 ...

最新文章

  1. 技术详解 | 如何用GAN实现阴影检测和阴影去除?
  2. 程序员致富的若干方法探讨
  3. Scrapy实例1-爬取天气预报存储到Json
  4. 搭建rabbitmq的docker集群
  5. 15、HTML单行文本框
  6. python 3.6.5 shell_Linux 安装 Python3.6.5
  7. 实训09.09:简单的彩票系统(自选多注)
  8. java 使用适当的签名_java11教程--类SignatureSpi用法
  9. sklearn 下距离的度量 —— sklearn.metrics
  10. ajax全局加密,Ajax请求接口加密研究(针对网页前端的接口安全加密机制研究)...
  11. notepad++查看aspx
  12. 转载:python中的pygame编写飞机大战(七) 播放爆炸动画
  13. [C++] 将 mp3 等音乐资源以资源形式嵌入 exe 文件中
  14. android数据线接口定义,安卓手机数据线接口类型
  15. 咏南ISAPI中间件
  16. Arnold渲染器适合什么样的电脑配置
  17. office16PowerPoint发现内容有问题
  18. 1833 雪糕的最大数量
  19. BUAA(2021春)实验:树的构造与遍历——根据提示循序渐进(可惜提示有问题Ծ‸Ծ)
  20. 机器学习---数据科学包-第4天

热门文章

  1. 从阿里到网易,一位非985/211本科应届生的一年求职路
  2. ubuntu 紧急模式
  3. 战斗录像工具开发记录
  4. 众说区块链:区块链在食品安全溯源领域中的应用
  5. Java简单类与对象,封装,多态,继承,接口,设计模式,某游戏系统的需求如下,请按照面向对象思想进行设计并实现。
  6. Eclipse 3.4 Ganymede 新增的插件安装方式
  7. WWDC18 iOS 自动生成强密码和自动填充验证码/密码
  8. 统计立方数(zzuli)
  9. ESP32开发之旅——基于ESP32的室内空气质量检测系统
  10. 关闭移动存储设备“自动播放”功能