成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

在選擇數(shù)據(jù)庫的路上,我們遇到過哪些坑?(2)

lavnFan / 3456人閱讀

摘要:有關(guān)進(jìn)行調(diào)用的進(jìn)一步危害,請(qǐng)觀看這段有關(guān)安全漏洞的討論。索引索引基本上會(huì)復(fù)制數(shù)據(jù)庫中的信息片段,這樣有利于它迅速找到節(jié)點(diǎn)。不管怎樣,它都能事務(wù)性地依次通過數(shù)據(jù)庫中的所有節(jié)點(diǎn)。

【編者按】你會(huì)怎么選擇數(shù)據(jù)庫,是關(guān)系數(shù)據(jù)庫、XML 數(shù)據(jù)庫、資源描述框架(RDF),還是圖形數(shù)據(jù)庫?本文的第1部分深入而生動(dòng)地探討了各種選擇。在第2部分,將深入介紹使用 Neo4j 的注意點(diǎn)。文章系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。

過渡到 Neo4j 之后的經(jīng)驗(yàn)和教訓(xùn)

下面介紹一些有關(guān)運(yùn)行 Neo4j 的實(shí)用技巧:

1. 如果你是 Java 商城,請(qǐng)嵌入式地運(yùn)行 Neo4j

Neo4j 是本地 Java 平臺(tái),我們又是 Java 商城,用 Neo4j 相當(dāng)合適。嵌入 Neo4j 讓我們不用再進(jìn)行 REST 調(diào)用,這對(duì)于安全來說確實(shí)很重要。有關(guān)進(jìn)行 REST 調(diào)用的進(jìn)一步危害,請(qǐng)觀看這段有關(guān) REST 安全漏洞的 JavaOne 討論。

嵌入式地運(yùn)行 Neo4j 還為我們大幅降低了復(fù)雜性。我們可以直接在進(jìn)程中調(diào)用 Neo4j API,從而快速了解 Cypher 語言,以便運(yùn)行 Cypher 和 Java API 這兩者的結(jié)合體。同時(shí)我們?cè)僖膊恍枰泄芎头峭泄艿臄U(kuò)展了。

2. 摸清自己的優(yōu)勢

摸清自己的優(yōu)勢和所選擇的工具的優(yōu)勢,這一點(diǎn)極為重要。用工具來做不適當(dāng)?shù)氖?,效果?huì)大打折扣。

本地圖形數(shù)據(jù)庫在關(guān)系方面的表現(xiàn)確實(shí)很好;在圖形中找到切入點(diǎn),然后按照需要深入地研究各種關(guān)系,這在 Neo4j 中快得驚人。但如果想要在單個(gè)節(jié)點(diǎn)之外進(jìn)行復(fù)雜的多值屬性全文檢索,效果就大打折扣了 —— 但我們選擇圖形數(shù)據(jù)庫并不是為了做這個(gè)。

3. 了解查詢時(shí)會(huì)發(fā)生哪些事情

了解查詢時(shí)會(huì)發(fā)生哪些事情,這一點(diǎn)也極為重要,這能夠優(yōu)化 Cypher 語言。

請(qǐng)看下面這個(gè)非常簡單的查詢。我想要找到 Franklin Country 所有擁有狩獵執(zhí)照的男性,并且執(zhí)照上的地址需要和此人的家庭住址相匹配,以便我們確認(rèn)這是同一個(gè)人。

我有一個(gè)人員節(jié)點(diǎn),一個(gè)執(zhí)照節(jié)點(diǎn),還有一個(gè)位置節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)上都有各種不同屬性:

數(shù)據(jù)庫要做的第一件事就是找到切入點(diǎn)(可能有多個(gè)切入點(diǎn)),然后圖形從切入點(diǎn)展開搜索。尋找切入點(diǎn)通常是個(gè)讓人頭痛的問題。為此要使用帶有靜態(tài)索引集的基于規(guī)則的規(guī)劃程序,這一軟件已于近期升級(jí)為基于費(fèi)用。這雖然還不夠完美,但無疑已經(jīng)朝著正確的方向前進(jìn)了一大步。

索引

索引基本上會(huì)復(fù)制數(shù)據(jù)庫中的信息片段,這樣有利于它迅速找到節(jié)點(diǎn)。在本例中,只使用信息片段來確定切入點(diǎn)。雖然不是必須要使用索引,但它確實(shí)能派上用場。如果要在特定的節(jié)點(diǎn)屬性上進(jìn)行檢索,在節(jié)點(diǎn)上設(shè)置一個(gè)索引會(huì)是個(gè)好辦法,即使這會(huì)占用磁盤空間。

索引分為兩種:schema 和 legacy。Schema 索引是最新版,使用內(nèi)部自定義的 Neo4j 內(nèi)置索引,目前是默認(rèn)設(shè)置。

一旦利用 Cypher 或 Java API 創(chuàng)建 schema 索引后,這些索引就會(huì)自動(dòng)由數(shù)據(jù)庫維護(hù)。例如,如果你想在每個(gè)帶有“人員”標(biāo)簽和“性別”屬性的節(jié)點(diǎn)上創(chuàng)建索引,當(dāng)你創(chuàng)建新節(jié)點(diǎn)、更改節(jié)點(diǎn)值或刪除節(jié)點(diǎn)時(shí),數(shù)據(jù)庫將自動(dòng)對(duì)其進(jìn)行更新。這時(shí)你也可以設(shè)置限定條件,比如必須存在屬性或?qū)傩员仨毷俏ㄒ坏摹?/p>

Legacy 索引是 Lucene 索引,是較早的版本但尚未棄用??梢酝ㄟ^配置文件、Neo4j 屬性文件、Java API 或 Cypher 來設(shè)置 legacy 索引。Legacy 索引使用的是 Lucene 而非 Neo4j 專有索引機(jī)制。我們?cè)谟?Neo4j 時(shí)幾乎沒有什么漏洞,而每次遇到的漏洞基本都和 legacy 索引有關(guān)。即使是這樣,有時(shí)候這些索引也是必要的。

Apache Luke 是一款非常不錯(cuò)的開源工具,用戶可以用它直接查看和搜索 Lucene 索引。這也幫助我們修復(fù)了 legacy 索引中的異常行為。

自動(dòng)索引與手動(dòng)索引

Legacy 索引有兩種用法:自動(dòng)索引和手動(dòng)索引。我建議使用自動(dòng)索引,因?yàn)樗菀拙S護(hù)?;旧现灰O(shè)置一次(可以在配置文件中設(shè)置也可以通過 API 設(shè)置),然后設(shè)為在特定類型的節(jié)點(diǎn)上為特定類型的屬性編寫索引。自動(dòng)索引還能夠在必要時(shí)輕松重建索引。

但是用戶無法指定是哪種類型的索引。在 Lucene 中,schema 存在不同索引類型,例如字符串、區(qū)分大小寫,以及數(shù)值,這些都是物理上獨(dú)立的索引。

如果你在查詢 Lucene 時(shí)想要使用這些索引,必須要做的第一件事就是告訴 Lucene 要使用哪個(gè)索引。但如果進(jìn)行自動(dòng)索引,Neo4j 可以根據(jù)你要編寫索引的第一個(gè)對(duì)象來選擇使用哪個(gè)索引。例如,如果你設(shè)置的第一個(gè)索引是藍(lán)色,Neo4j 就會(huì)明白藍(lán)色是字符串,然后會(huì)永久性地將藍(lán)色放在字符串索引中。

如果你能很好地控制收到的數(shù)據(jù),這一索引方式效果會(huì)很不錯(cuò)。但我們的系統(tǒng)沒有這樣。我們從許多不同的來源接收數(shù)據(jù),所以收到的“blue”(藍(lán)色)屬性可能會(huì)指年齡。但如果這一屬性是最先收到的,Neo4j 就會(huì)把年齡作為基于字符串的屬性而不是數(shù)值屬性來編寫索引,如此一來,之后就沒法按照我希望的方式展開進(jìn)一步比對(duì)和排列了。在這種情況下,只能手動(dòng)創(chuàng)建索引。

使用自動(dòng)索引的另一個(gè)好處是,如果目錄無故損壞,很容易就能修復(fù)目錄。可以暫停整個(gè)數(shù)據(jù)庫,進(jìn)入 Lucene 索引目錄,刪除此目錄,重啟數(shù)據(jù)庫,然后 Neo4j 會(huì)為所有節(jié)點(diǎn)重新編寫索引。但如果已經(jīng)進(jìn)行了手動(dòng)索引,你只能返回,然后為所有節(jié)點(diǎn)重新編寫索引。

范圍查詢

下面一系列幻燈片顯示了范圍查詢:

我想查詢“profile”(個(gè)人信息),所以我把 PROFILE 放在查詢內(nèi)容的前面。我想找到收入為特定數(shù)值(50500)的所有人群并且只返回最前面的兩個(gè)結(jié)果。

這段代碼表明,我已經(jīng)有了某人的收入索引,規(guī)劃程序的限值是 2。NodeIndexSeek 用這一索引來查找數(shù)值,從一個(gè)擁有 22 萬人的樣本數(shù)據(jù)庫中進(jìn)行了大約 2800 次數(shù)據(jù)庫訪問。

在接下來的范圍查詢中,我準(zhǔn)備查找收入低于 50500 的人:

在這次的查詢中,我們執(zhí)行了 NodeByLabelScan,由于沒有使用索引,我們進(jìn)行了多達(dá) 43 萬次數(shù)據(jù)庫訪問。在 Neo4j 第 2.3 版之前,schema 索引不支持范圍,所以你必須得用 legacy 索引,然后直接查詢 Lucene 索引,才能發(fā)揮作用。

第 2.3 版修復(fù)了這一問題;現(xiàn)在有了 NodeIndexSeekByRange,可在 schema 標(biāo)簽上提供范圍索引:

4. 不要使用內(nèi)部節(jié)點(diǎn) ID

使用當(dāng)前節(jié)點(diǎn) ID 是個(gè)很大的誘惑,但這種做法非常不可取,這是因?yàn)樵谀承r(shí)刻,這種做法會(huì)導(dǎo)致數(shù)據(jù)庫內(nèi)容被刪除。請(qǐng)閱讀這篇介紹,了解更多相關(guān)內(nèi)容。

Neo4j 使用增量日志。如果你刪除了某個(gè)節(jié)點(diǎn),最后系統(tǒng)會(huì)翻轉(zhuǎn)節(jié)點(diǎn) ID,這樣你就可以重復(fù)使用這些數(shù)字。我們結(jié)合使用了節(jié)點(diǎn)標(biāo)簽和隨機(jī)選擇的 UUID,這樣如果你的 API 始終暴露在外,就可以提供額外的安全保障。

5. 數(shù)據(jù)建模很重要

數(shù)據(jù)模型的重要程度至少和查詢相當(dāng)。下面的說明很有用:可以通過多重關(guān)系類型或關(guān)系上的屬性來為部分關(guān)系建模。兩種方法似乎同樣合理,但它們的性能表現(xiàn)可能大相徑庭。一定要了解一下 GraphAware 對(duì)這一內(nèi)容的介紹。其區(qū)別在于,一方定義不同類型的 personplace 之間的關(guān)系……

……而另一方則表示有三種不同的屬性類型:

性能表現(xiàn)提升了八倍。上述 GraphAware 的文章深入詳細(xì)地解釋了這一概念。

6. 優(yōu)化性能

EXPLAINPROFILE 絕對(duì)是你的良師益友。別擔(dān)心 Java API,而查詢規(guī)劃程序還很年輕,在許多情況下都比 Cypher 要快。如果你要設(shè)定基準(zhǔn),一定要以溫備份數(shù)據(jù)庫設(shè)定基準(zhǔn)。這樣就能加載 Neo4j 的數(shù)據(jù)庫緩存。

7. 一定要交流!

Neo4j 擁有強(qiáng)大的支持社區(qū),包括谷歌論壇、Slack 協(xié)作頻道、Stack Overflow 網(wǎng)站和非常出色的支持團(tuán)隊(duì)。

8. 在工具欄里添加下面的代碼

借助下面的樣板代碼,可以檢查數(shù)據(jù)庫中的每個(gè)節(jié)點(diǎn)并修復(fù)所有問題。這一示例有時(shí)會(huì)抓取關(guān)系,但你也可以對(duì)節(jié)點(diǎn)或其他限定條件進(jìn)行同樣的操作。

不管怎樣,它都能事務(wù)性地依次通過數(shù)據(jù)庫中的所有節(jié)點(diǎn)。在本例中,每個(gè)事務(wù)是 90000 次操作,如果有需要,還可以批量更改整個(gè)數(shù)據(jù)庫:

本文系 OneAPM 工程師整理呈現(xiàn)。OneAPM 能為您提供端到端的應(yīng)用性能解決方案,我們支持所有常見的框架及應(yīng)用服務(wù)器,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因。分鐘級(jí)部署,即刻體驗(yàn),性能監(jiān)控從來沒有如此簡單。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客。

本文轉(zhuǎn)自 OneAPM 官方博客

原文地址:https://dzone.com/articles/from-good-to-graph-choosing-the-right-database

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17534.html

相關(guān)文章

  • 選擇數(shù)據(jù)庫路上我們遇到哪些?(1)

    摘要:資源描述框架三元組存儲(chǔ)為了解決問題,把我們的所有文檔從遷移到資源描述框架,這一框架又被稱為三元組存儲(chǔ)。下面這些資源描述框架的三元組可以體現(xiàn)這一示意圖我們的數(shù)據(jù)庫確實(shí)很給力,總體來說我們也相當(dāng)滿意。 【編者按】你會(huì)怎么選擇數(shù)據(jù)庫,是關(guān)系數(shù)據(jù)庫、XML 數(shù)據(jù)庫、資源描述框架(RDF),還是圖形數(shù)據(jù)庫?這篇演講深入而生動(dòng)地探討了各種選擇。本文系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)...

    n7then 評(píng)論0 收藏0
  • 前端入指南

    摘要:作為自學(xué)兩年的初級(jí)前端,希望對(duì)那些想入門前端開發(fā)的人分享一些觀點(diǎn)。尤其是這幾年前端領(lǐng)域飛速的發(fā)展,新東西層出不窮?;蛘哧P(guān)注下我的微信公眾號(hào)前端獲取每天分享前端入門知識(shí)。為什么選擇前端 做一件事之前最好問問自己為什么要做,然后再去思考該怎么做。如果只是看到別人做了,并且有很不錯(cuò)的收入,然后自己就決定做了,很可能中途放棄浪費(fèi)掉很多時(shí)間。起碼問自己一個(gè)問題:我是否真的熱愛這個(gè)領(lǐng)域,并且很樂意在這個(gè)...

    junnplus 評(píng)論0 收藏0
  • 記我nginx + php5-fpm配置問題和解決方式

    剛剛我在配置nginx+php5-fmp的虛擬主機(jī)環(huán)境, 在配置的過程中,在配置的過程中出現(xiàn)了一些問題, 在此記錄下來, 以備后患。 請(qǐng)注意, 這里不是寫如何配置這個(gè)虛擬主機(jī), 而是記錄我在配置的時(shí)候遇到的問題以及如何克服這些問題的過程。 環(huán)境: ubuntu 14.04 (64位) nginx 1.4.6 php 5.5.9 開始 開始的時(shí)候, 因?yàn)槲沂切掳惭b的ubuntu的系統(tǒng), ...

    xuweijian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<