当前位置: 首页 > news >正文

为什么要转mysql_资深程序员剖白:我为何要从MySql转向图形数据库

最近在抓取一些社交网站的数据,抓下来的数据用MySql存储。问我为什么用MySql,那自然是入门简单,并且我当时只熟悉MySql。可是,随着数据量越来越大,有一个问题始终困扰着我,那就是社交关系的存储。

就以新浪微博举例,一个大V少则十几万,多则几千万的粉丝,这些关注关系要怎么存呢?在MySql中,一条关注关系(大V id,大V的一个粉丝 id)存为一条数据,那么当用户数量上来的时候,关注关系轻松破亿,破十亿,甚至上百亿,并且为了保证每条数据的唯一性,还需要设置联合索引,MySql就有些力不从心了。那么有人要说了:分表呀。嗯,没错,分表的确可以在插入端和读取端提升一些速度。比如我们可以根据id哈希到100张表中。查询一个用户有哪些粉丝是快了,但是查询一个用户关注了哪些人时仍然需要遍历全表。好,这时候我们还可以以(id,其关注的一个用户的id)再构造100张表,于是两种查询都快了。然而,后面那100张表是冗余数据,看着就不爽。并且生成一张子图也不方便(需要多次写SQL查表)。

于是,在搜索更好的方案时无意间发现了图形数据库,查阅一番资料后感觉确实是个不错的选择,毕竟业界的一些大佬,如twitter,Adobe等也在用。

那么,什么是图形数据库呢?在这里我贴上较为官方的定义:a database that uses graph structures for semantic queries with nodes, edges and properties to represent and store data – independent of the way the data is stored internally. It’s really the model and the implemented algorithms that matter.注意,这里只是说数据模型是图结构的,没有说数据的存储也一定要是图结构的。其数据模型如下图

639740dc6b2b4e419320b54b21ed97ff636225931437074119.jpg

为什么要选择图形数据库

拿比较常用的图形数据库Neo4j来举例说明,首先,先简要介绍一下Neo4j。Neo4j是由Java和Scala写成的一个NoSql数据库,专门用于网络图的存储。更详细的内容可见官网。作为一个图形数据库,Neo4j有以下优点:

1.更快的数据库操作。当然,有一个前提条件,那就是数据量较大,在MySql中存储的话需要许多表,并且表之间联系较多(即有不少的操作需要join表)。

2.数据更直观,相应的SQL语句也更好写(Neo4j使用Cypher语言,与传统SQL有很大不同)。

3.更灵活。不管有什么新的数据需要存储,都是一律的节点和边,只需要考虑节点属性和边属性。而MySql中即意味着新的表,还要考虑和其他表的关系。

4.数据库操作的速度并不会随着数据库的增大有明显的降低。这得益于Neo4j特殊的数据存储结构和专门优化的图算法。

接着,试着从更深一些的层次看图形数据库。我将从Neo4j的数据存储和数据读写两方面来说明为什么选它。

1.数据存储

Neo4j对于图的存储自然是经过特别优化的。不像传统数据库的一条记录一条数据的存储方式,Neo4j的存储方式是:节点的类别,属性,边的类别,属性等都是分开存储的,这将大大有助于提高图形数据库的性能。如下图:

3a8f937ac5eb4c7ab759b905cb7d0b03636225931488357052.jpg

2.数据读写

在Neo4j中,存储节点时使用了"index-free adjacency",即每个节点都有指向其邻居节点的指针,可以让我们在O(1)的时间内找到邻居节点。另外,按照官方的说法,在Neo4j中边是最重要的,是"first-class entities",所以单独存储,这有利于在图遍历的时候提高速度,也可以很方便地以任何方向进行遍历。

0a8e0a3760454c96a59865daf3ee8c96636225931551050638.jpg

为什么要选Neo4j

如今可供选择的图形数据库也不少,为什么就选择了Neo4j呢?我简要归结为以下几点:

1.作为较早的一批图形数据库之一,文档和各种技术博客较多。

2.最开始曾尝试过flockdb(据说操作简单+轻量级),但是败于安装过程,依赖太多。

3.网上经常有人将orientdb,arangodb与neo4j做对比,我当然也考虑过orientdb和arangodb。从易用性来说都差不多。速度上的话看过一些评测,arangodb应该是相对最快的,因为其使用了混合索引。但是从稳定性来说,neo4j是最好的。

最后做个总结吧。图形数据库是这几年兴起的,整体还不是很完善,而且适用面也是比较窄的。只有在明确自己的需求之后,才能确定是否选择图形数据库。如果仍有疑虑,不确定是否有这个需求,或是在使用neo4j时遇到了难点,慧都学院推出的neo4j公开课会是一个不错的选择。由数据库领域资深专家倾力打造的系统性讲解,不仅有干货,还有点对点问答互动,现在关注慧都学院官方微信公众号即有机会获得免费听课券!(作者:刀刀流 | 编辑:学院君)

更多行业资讯,更新鲜的技术动态,尽在慧都学院。

370dad048a9747c680bd3fd9d0170fc5636280260144882492.jpg

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

a6e1590ae4b228073faff3806334194e.png3

好文不易,鼓励一下吧!

相关文章:

  • 近代自然科学为啥未诞生在中国----中国文化的欠缺
  • 一个可以独立运行的java应用程序_在Ubuntu上将Java应用程序作为服务运行
  • Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
  • mysql数据的导出与导入_浅析MySQL数据的导出与导入知识点
  • Nebula3渲染层: Graphics
  • go分析和kegg分析_一些GO及KEGG分析的知识
  • iPhone对OpenGL ES的支持程度!
  • XACT与X3DAudio整合的问题
  • mysql的分离搭建_MySQL 读写分离环境搭建
  • Thanksgiving!——2008博文视点的光荣归于支持我们的读者、专家们
  • ai文字变成路径_新手必备!AI常用快捷键和一些小技巧
  • 基于wince的网络音视频通信(简单易明版)
  • lvs dr 链接mysql_集群lvs-dr应用之wordpress(共享后台MySQL存储)
  • Nebula3绘制2D纹理
  • python 条件语句知识讲解_Python 知识要点:if 条件语句
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Asm.js的简单介绍
  • hadoop集群管理系统搭建规划说明
  • HTTP 简介
  • Java 多线程编程之:notify 和 wait 用法
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • MySQL-事务管理(基础)
  • ReactNativeweexDeviceOne对比
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 编写符合Python风格的对象
  • 编写高质量JavaScript代码之并发
  • 当SetTimeout遇到了字符串
  • 关于使用markdown的方法(引自CSDN教程)
  • 解析 Webpack中import、require、按需加载的执行过程
  • 免费小说阅读小程序
  • 那些年我们用过的显示性能指标
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何进阶一名有竞争力的程序员?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 手写一个CommonJS打包工具(一)
  • 提醒我喝水chrome插件开发指南
  • 一起参Ember.js讨论、问答社区。
  • 运行时添加log4j2的appender
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ###STL(标准模板库)
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (TOJ2804)Even? Odd?
  • (二)Eureka服务搭建,服务注册,服务发现
  • (三)模仿学习-Action数据的模仿
  • (转)【Hibernate总结系列】使用举例
  • (轉貼) UML中文FAQ (OO) (UML)
  • *2 echo、printf、mkdir命令的应用
  • .Net 8.0 新的变化