用好数据库索引提升嵌入式软件性能和效率

数据库频道也向您推荐《数据库之索引与查询专题》专题,相信这个专题能帮助您更好的理解本文。为了从一本书中获取信息,怎样做更有效?仔细阅读每一页内容,还是根据索引来精确确定要获取信息的位置?

显然后者更有效,嵌入式系统也应该能如此智能。如今,嵌入式应用程序管理着数量高速增长的复杂数据。找到正确的数据(无论是寻找网络包的路由目标节点、计算地图上点与点之间的距离、以及其他计算目标)通常必须在实时性能要求下被实现。

幸运的是,编程人员可以使用数据索引将查找速度从线性级别提升到对数级别。随着成品数据库管理系统(DBMS)在嵌入式系统开发中的日趋重要,索引也得到了更多的使用,多数嵌入式数据库都支持至少一种索引类型。

然而,在许多项目中,首先考虑(通常也是唯一的)索引是B树。这是因为在现有的大量索引类型中,只有B树索引最为通用。毫无疑问,B树能够高效完成基本的搜索操作,诸如:精确匹配、前缀、范围搜索等。然而,对于IP路由、映射、模式查询算法开发等目标来说,非通用的索引类型更加合适,并且能够带来更快的速度和对CPU时钟周期等资源更有效地利用(见图1)。

图 1: B树并不是嵌入式应用程序唯一的索引选择

下面章节展示了如何使用两种非通用索引类型:R树和Patricia trie

空间索引和R树

映射(地图)以及其他基于位置的功能在移动嵌入式应用中十分常见,这些应用从战斗车辆中的战场支持系统到用来寻找最近的比萨饼店的移动电话应用程序。这些应用程序基于空间查询的算法,例如:找到离当前位置最近的对象,找到用户附近的全部对象,等等。

B树索引是一维的:它无法处理用于空间搜索的二维和三维坐标。R树(又叫做Guttman R树,根据发明者命名)是一个不错的替代品。它使 用边界盒(bounding box)来映射空间中的对象。如果一个对象由坐标点(X, Y)表示,那么他的边界盒是一个边长为1的正方形。

对所有的几何对象(线、多边形以及其他形状),边界盒是这样一个长方形:其左上角坐标小于等于该对象中的任何点,其右下角坐标大于等于该对象中的任何点。换句话说,边界长方形是能够完全包含给定对象的最小长方形。

R树索引通常被用来加速空间搜索(发现包含某个点的长方形、找出全部与给定长方形重合的长方形,诸如此类)。在边界盒的帮助下,应用程序能够管理各种形状。

使用eXtremeDB的数据库定义语言,空间对象可以被描述如下:

  1. /* 表示地图上点的结构 */  
  2. struct Point  
  3. {  
  4. double latitude;  
  5. double longitude;  
  6. };  
  7. class Street {  
  8. /* 表示街道的点向量 */  
  9. vector<Point> points;  
  10. /* 街道封装长方形 */  
  11. rect<double> wrap_rect;  
  12. rtree<wrap_rect> streets_idx;  
  13. }; 

如果我们希望加入一条新的街道,应用程序必须存储街道的坐标并计算其边界盒。

  1. Street street;  
  2. mco_rect_t wr;  
  3. wr.l.x = DOUBLE_MAX;  
  4. wr.l.y = DOUBLE_MAX;  
  5. wr.r.x = DOUBLE_MIN;  
  6. wr.r.y = DOUBLE_MIN;  
  7. Street_new(trans, &street);  
  8. Street_points_alloc(&street, n_points);  
  9. for (i = 0; i < n_points; i++)   
  10. {  
  11. if (points[i].latitude < wr.l.latitude) {  
  12. wr.l.latitude = points[i].latitude;  
  13. }  
  14. if (points[i].longitude < wr.l.longitude) {  
  15. wr.l.longitude = points[i].longitude;  
  16. }  
  17. if (points[i].latitude > wr.r.latitude) {  
  18. wr.r.latitude = points[i].latitude;  
  19. }  
  20. if (points[i].longitude > wr.r.longitude) {  
  21. wr.r.longitude = points[i].longitude;  
  22. }  
  23. Street_points_put(&street, i, &points[i]);  
  24. }  
  25. Street_wrap_rect_put(&street, &wr); 

如果用户搜索一个位置,地图应用程序将结果(街道)在窗口中表示为一个坐标为||的地图长方形。

  1. mco_rect_t r;  
  2. mco_cursor_t c;  
  3. MCO_RET rc;  
  4. r.l.x = min_longitude;  
  5. r.l.y = min_latitude;  
  6. r.r.x = max_longitude;  
  7. r.r.y = max_latitude;  
  8. if (Street_streets_idx_search(trans, MCO_EQ, &c, (double*)&r) == MCO_S_OK)  
  9. {  
  10. for (; rc == MCO_S_OK; rc = mco_cursor_next(trans, &c))  
  11. {  
  12. Street street;  
  13. Street_from_cursor(trans, &c, &street);  
  14. // display it  
  15. }  

Patricia trie

B树可以利用指定的前缀来定位关键字,例如,寻找以名字以“AAA”开头的公司。然而,一些应用程序必须搜索代表着一个特定值最长前缀的关键字。B树可以实现这种需求,但必须从最长的前缀开始进行多次迭代并且查询不同的给定值前缀。

一种更加有效的前缀查找索引是用于查询字母-数字编码的实践算法,即通常所说的Patricia trie。Patricia trie是二叉树的一种变形,通常用于电话路由以及IP过滤。在第一种情况中,给定接入电话以及一张带有已知前缀的接线员表,应用程序必须选择正确的接线员接到该电话。在第二种情况下,给定了有效/拒绝域的IP掩码,收到的(一个)HTTP请求应被分类为接受、拒绝、转发,等等。下面的数据库模式定义了一张路由表,带有一个由位向量表示的掩码。

  1. class Route  
  2. {  
  3. Vector<bool> dest;  
  4. uint4 gateway;  
  5. uint4 interf;  
  6. uint2 metric;  
  7. unique patricia  by_dest;  
  8. }; 

为了给接受到的IP地址找到合适的转发目标,应用程序使用Patricia trie对eXtremeDB做出如下查询:

  1. mco_cursor_t csr;  
  2. if (MCO_S_OK == Route_by_dest_index_cursor(trans, &csr)) {  
  3. uint1 mask[4];  
  4. make_mask(mask, ip, 32);  
  5. /* find routes which mask match this IP address */  
  6. /*寻找掩码与IP地址匹配的转发节点*/  
  7. if (MCO_S_OK == Route_by_dest_prefix_match(trans, &csr, mask, 32);  
  8. Route route;  
  9. Route_from_cursor(trans, &csr, &route);  
  10. ...  
  11. }  

下面的代码将表示IP地址的整数转换为位向量:

  1. void make_mask(uint1* mask, uint4 val, int bitnum)  
  2. {  
  3. int i;  
  4. val = val >> (32-bitnum);  
  5. memset(mask, 0, 4);  
  6. for (i = 0; i < bitnum; i++, val = val >> 1)  
  7. {  
  8. mask[i >> 3] |= (val&1) << (i&7);  
  9. }  

可选索引越多,结果越好

使用诸如R树和Patricia trie的专用索引加快了代码开发速度,提升了代码效率,并使应用程序能够处理更加复杂的数据结构。尽管著名的B树足以处理大量的普通查询任务,不怎么出名的索引类型能够在专用应用程序和数据类型中做得更好。R树能够高效处理映射和地理空间数据,而Patricia trie是电话路由、IP过滤以及其他必须通过匹配特定数值最长前缀的关键字来完成的任务的理想方案。

Steve Graves是McObject公司的CEO和创始人之一。McObject公司专注于嵌入式数据库系统软件。在创立McObject之前,Steve曾担任Centura Solutions公司总裁以及Centura Software公司(纳斯达克股票代码:CNTR)负责全球咨询方面的副总裁。他还担任Raima公司的总裁兼首席运营官。可以通过[email protected]与Steve联系。

Konstantin Knizhnik是McObject公司的软件工程师,参与了嵌入式数据库系统eXtremeDB的开发。他同样还是多个优秀开源项目的作者,其中包括基于Java的数据库管理系统Perst和Perst Lite,以及包括Java、C++和C#在内的多种编程语言的扩展工具。可以通过[email protected]与Konstantin联系。如果您有任何问题可以和McObject中国区联系。

【编辑推荐】

  1. SQL优化索引的实操与功能
  2. MySQL索引被破坏所产生的问题解决
  3. MySQL SQL优化的索引问题详解
  4. Oracle数据库索引的优点与缺点简介
  5. Oracle数据库中的最常用的索引有哪些   

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/298873.html<

(0)
运维的头像运维
上一篇2025-05-23 03:35
下一篇 2025-05-23 03:37

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注