有人可以提供一個真實的例子來說明如何在Bigtable中構建數據嗎?請從搜索引擎,社交網絡或任何其他熟悉的角度進行討論,這些觀點清楚而實用地說明了行 - >列族 - >列組合優於傳統的規範化關係方法。Bigtable實例
回答
閱讀原谷歌白皮書是有幫助的:
由於是對谷歌的數據架構信息來源這一全面的列表:
http://highscalability.com/google-architecture
更新:11/4/14
的谷歌白皮書PDF的新版本可以在這裏找到:
http://static.googleusercontent.com/media/research.google.com/en/us/archive/bigtable-osdi06.pdf
我相信不同之處在於數據被查詢的方式,而不是存儲方式。
關係數據庫和NoSQL
之間的主要區別在於後者中沒有SQL
。
這意味着你(而不是查詢優化器)自己編寫查詢計劃。
如果您知道如何做到這一點,這可能會提高查詢性能。
考慮一個典型的搜索引擎查詢:查找頂部10
包含全部(或部分)單詞的頁面,比如說,「溼T恤比賽」,按相關性排序(爲簡單起見,我們將單詞旁邊放在旁邊)。
要做到這一點,你需要的所有單詞拆分,並保存在由(word, relevance, source)
下令搜索和迭代列表。然後,你的分區這個名單到(3 * ranks)
集(每個起始於在您的搜索查詢的話,在一個給定的級別上),其中ranks
是可能的數量或級別,比如,1
到10
;並加入source
,。
在關係數據庫中它是這樣的:
SELECT w1.source
FROM ranks r1
JOIN words w1
ON w1.word = 'wet'
AND w1.rank = r1.value
CROSS JOIN
ranks r2
JOIN words w2
ON w2.word = 'shirt'
AND w2.rank = r2.value
AND w2.source = w1.source
CROSS JOIN
ranks r3
JOIN words w3
ON w3.word = 'contest'
AND w3.rank = r2.value
AND w3.source = w1.source
ORDER BY
relevance_formula (w1.rank, w2.rank, w3.rank)
LIMIT 10
這是最好的使用MERGE JOIN
在三個按職級劃分集來執行。
但是,我沒有意識到優化器會建立這個計劃(不考慮relevance_formula
可能不會分配給各個隊伍)。
要解決這個問題,你應該實現自己的查詢計劃:開始每個單詞/秩對的頂部和公正的同時下降所有三組,跳過缺少的值,並使用search
而不是next
如果你覺得有在其中一組中將跳過太多。
因此說,關係方法爲您提供了更便捷的方式在可能的性能損失代價來查詢數據。
如果你正在開發一個校園網服務器,然後寫那些SELECT *
是OK,即使它們被執行一微秒的時間比他們可能可能。但是,如果你正在開發一個Google,那麼花一些時間來優化查詢是值得的(純粹的關係系統只允許使用SQL
來訪問他們的數據)。
的這種稱爲NoSQL
和關係數據庫有時擴散到彼此中。例如,Berkeley DB
是衆所周知的NoSQL
存儲引擎,其被MySQL
用作其存儲後端以允許SQL
查詢。反之亦然,HandlerSocket
允許通過構建的MySQL
數據庫對關係數據庫進行純關鍵字值查詢。
- 1. Google雲端Bigtable實例
- 2. 無法連接到Google Cloud Bigtable實例
- 3. Auth從計算實例連接到Bigtable
- 4. 實現聲明的Cloud Bigtable寫入QPS
- 5. BigTable的設計 - 一個BigTable的細胞
- 6. BigTable vs noSQL
- 7. BigTable with C#Library
- 8. Google Bigtable-primarykey
- 9. Bigtable批量插入
- 10. Bigtable導入錯誤
- 11. NoSQL(BigTable ...)和TimeSeries Data
- 12. Google Cloud Dataflow管道中的例外情況從BigQuery到Cloud Bigtable
- 13. Google Cloud Bigtable是否支持透明的維護/實時遷移?
- 14. 將成千上萬的實體插入BigTable
- 15. Bigtable性能影響列族
- 16. 谷歌雲上的TTL Bigtable
- 17. 學習Google App Engine&BigTable
- 18. Bigtable和複合主鍵
- 19. Google Cloud Bigtable和Java 8
- 20. Bigtable中列鍵的順序?
- 21. bigtable是否需要鎖定?
- 22. 實例退休:實例停
- 23. 如何從父實例實例化子實例
- 24. 實例
- 25. 實例
- 26. LibSVM.classifyInstance(實例實例)拋出顯示java.lang.NullPointerException
- 27. 使用OpsWorks實例啓動實例AMI
- 28. 類定義實例實例化問題
- 29. 實例化JavaScript錯誤對象實例
- 30. 通過實例ID獲取實例
Altrough您的文章,使有效poitns,有數據的存儲方式有很大的不同。 HandlerSocket完全用於跳過RDBMS的SQL層,當你想要的是通過它的索引獲得行時。您可以在基於文檔的數據存儲中使用查詢。文檔模型商店,圖形商店,關鍵/價值商店 - 每個商店都存儲不同的數據,以便以不同的方式更有效地查詢數據。在數據出於性能目的而非規範化後,即使在合理的數據庫中。 –
@Darhazer:在不同的關係數據庫中,數據的存儲方式是不同的:在'PostgreSQL'中沒有聚簇表,而在'InnoDB'中沒有聚簇表。當然,我錯過了許多事情,但如果我試圖覆蓋所有的事情,我會打30,000個郵件大小,每個郵件限額30個答案。 – Quassnoi
是的,但是這種差異僅在於數據的物理組織,而問題是關於數據建模。 –