成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用好數據庫索引提升嵌入式軟件性能和效率

原創
數據庫
使用數據索引能夠成數量級的提升嵌入式應用的線性查找速度。B樹是最著名的通用索引,然而諸如R樹和Partricia tries之類的專用索引則是以IP過濾為代表的多種應用程序的理想方案。

51CTO數據庫頻道也向您推薦《數據庫之索引與查詢專題》專題,相信這個專題能幫助您更好的理解本文。為了從一本書中獲取信息,怎樣做更有效?仔細閱讀每一頁內容,還是根據索引來精確確定要獲取信息的位置?

顯然后者更有效,嵌入式系統也應該能如此智能。如今,嵌入式應用程序管理著數量高速增長的復雜數據。找到正確的數據(無論是尋找網絡包的路由目標節點、計算地圖上點與點之間的距離、以及其他計算目標)通常必須在實時性能要求下被實現。

幸運的是,編程人員可以使用數據索引將查找速度從線性級別提升到對數級別。隨著成品數據庫管理系統(DBMS)在嵌入式系統開發中的日趨重要,索引也得到了更多的使用,多數嵌入式數據庫都支持至少一種索引類型。

然而,在許多項目中,首先考慮(通常也是唯一的)索引是B樹。這是因為在現有的大量索引類型中,只有B樹索引最為通用。毫無疑問,B樹能夠高效完成基本的搜索操作,諸如:精確匹配、前綴、范圍搜索等。然而,對于IP路由、映射、模式查詢算法開發等目標來說,非通用的索引類型更加合適,并且能夠帶來更快的速度和對CPU時鐘周期等資源更有效地利用(見圖1)。

B樹并不是嵌入式應用程序唯一的索引

圖 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公司的總裁兼首席運營官??梢酝ㄟ^steve.graves@mcobject.com與Steve聯系。

Konstantin Knizhnik是McObject公司的軟件工程師,參與了嵌入式數據庫系統eXtremeDB的開發。他同樣還是多個優秀開源項目的作者,其中包括基于Java的數據庫管理系統Perst和Perst Lite,以及包括Java、C++和C#在內的多種編程語言的擴展工具。可以通過knizhnik@mcobject.com與Konstantin聯系。如果您有任何問題可以和McObject中國區聯系。

【編輯推薦】

  1. SQL優化索引的實操與功能
  2. MySQL索引被破壞所產生的問題解決
  3. MySQL SQL優化的索引問題詳解
  4. Oracle數據庫索引的優點與缺點簡介
  5. Oracle數據庫中的最常用的索引有哪些   
責任編輯:彭凡 來源: 51CTO
相關推薦

2010-05-18 16:33:10

eXtremeDB 4

2009-01-18 15:36:04

2011-03-07 09:57:24

Perst嵌入式數據庫

2011-03-11 11:19:05

嵌入式數據庫

2013-09-22 10:39:00

MeayunDB

2011-07-08 10:45:19

SqlceSqlCeConnec

2022-06-27 17:40:14

大數據數據科學

2012-11-21 17:35:21

Oracle技術嘉年華

2013-09-02 14:41:05

Java嵌入式SQLite

2010-03-23 09:08:05

2009-11-19 09:35:36

eXtremeDB嵌入式實時數據庫McObject

2011-04-18 11:34:34

嵌入式軟件測試

2017-10-09 10:40:43

AMD

2011-06-15 10:18:12

Windows PhoPerst

2009-06-11 16:34:19

2010-02-24 16:02:45

PerstSilverlight

2010-07-05 13:36:21

SQL Server

2011-03-11 11:12:47

eXtremeDB嵌入式

2023-04-27 07:06:18

2022-12-14 08:06:08

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文日韩在线视频 | 成人免费网站 | 成人精品鲁一区一区二区 | 色综合国产 | av影音资源 | 久久精品中文 | 国产精品一区二区三区在线 | 综合久 | www.9191| 日韩中文字幕一区二区 | 久久精品国产一区二区电影 | 欧美一区二区在线看 | 九九国产在线观看 | 国产亚洲精品久久午夜玫瑰园 | 在线播放中文字幕 | 欧美精品在线免费观看 | 久久久蜜桃一区二区人 | 日本三级在线网站 | 国产一区在线免费观看视频 | 99亚洲综合 | 中文字幕在线一区 | 精品国产一区二区三区久久久四川 | 国产综合精品一区二区三区 | 精品一区二区三区在线观看 | 老司机免费视频 | 欧美黄色一级毛片 | 黑人粗黑大躁护士 | 一区二区视频在线 | 久久久久亚洲精品 | 北条麻妃99精品青青久久 | 日本在线中文 | 成人在线精品视频 | 二区中文字幕 | 日韩久久精品 | 亚洲国产成人在线观看 | 久久久国产精品 | 国产高清久久久 | 国产一区二区观看 | 国产精品高潮呻吟 | 成人a网| 精品一区二区三区在线观看国产 |