【问题标题】:In my tests, NE4J seems so slow compared to MySQL. How can I make it faster?在我的测试中,NE4J 与 MySQL 相比似乎很慢。我怎样才能让它更快?
【发布时间】:2016-09-19 14:28:24
【问题描述】:

我是 NEO4J 的新手,我想看看它有多快。我开始对其进行测试,并在 MySQL 和 NEO4J 中创建了一个具有以下属性(字段)的表:

id    random_number    time_stamp

我编写了一个程序来生成海量数据并插入了大约 1.5 亿行(以及 Neo4J 中的节点)。我可以说写入速度几乎相同。

所以,我在两个数据库中测试了一个选择查询。 “我想获得 random_id 为 255454 的行(节点)之一”(我们从这个随机 id 知道有超过 30 行)

NEO4J:

match (t:testLabel {random_id: 255454}) RETURN t LIMIT 50;

MySQL:

SELECT * 
FROM  test 
WHERE  random_id=255454 LIMIT 50

NEO4J 大约需要 47 秒,MySQL 大约需要 25 秒才能返回结果。

磁盘上的 NEO4J 大小变为 ~35GB,磁盘上的 MySQL 大小变为 ~5.2 GB

而且两个数据库都没有表或属性的索引。

硬件:CPU: Corei7-4770 | 内存: 12GB | SSD硬盘


这是一个简单的测试,我的意思是两个数据库都非常简单并且具有基本结构,在测试之前我认为 NEO4J 比 MySQL 快。 因为我真的很喜欢 NEO4J,所以我想找到一个解决方案并再次使用它。

根据我的简单测试,NEO4J 不适用于大型且可扩展的项目。我想知道也许有一些方法可以让它更快! 性能测试非常简单,无论数据建模如何,所有数据库都必须拥有它。

那么磁盘的大小呢?

+ 我发现了 Jörg Baach 的另一个比较 question,您可能希望看到。

【问题讨论】:

  • 什么,你认为一些外星人写了一些 MySQL 开发人员没有想到的出色代码?如果您喜欢 Neo4J,请使用它。证明它对你有用,不必比 MySQL 快。
  • @N.B.我真的很喜欢NEO4J的方式。但我也需要性能来解决我的问题!
  • 真的吗?你的意思是在这么多使用它并认为它是一个有用系统的人中,你是少数拥有一些神秘软件的人之一,你根本无法使用它,因为一个更老更好的程序在愚蠢的合成中击败了它测试? :)
  • @N.B.我并不是说它没有用或类似的东西,正如你在我的问题中看到的那样,我正在寻找一种让它更快的方法!所以,我喜欢使用它,我喜欢让它更快。
  • 您将苹果与橙子进行比较。而且......询问如何对数据库引擎进行性能调整对于 StackOverflow 来说是题外话。而且...您的问题的基本问题是关于单个节点的查询时间,没有索引(不现实的场景,不使用索引)。

标签: mysql database performance neo4j


【解决方案1】:

比较关系数据库和图形数据库是一项艰巨的任务。

我认为一个更有帮助的测试是使用多个连接和 fk 检查跨多个表的查询性能。和neo4j比较,你会发现,性能可能比mysql好很多。

这样做:使用您的测试模型设置 4-5 个可能的用例。 dba 将要做的几件事,用户将要做的几件事等。确定有多少人将要这样做,确定他们这样做的频率。

选择简单的任务和复杂的任务。将 MySQL 性能与 Neo4J 进行比较。您会发现一个 DB 在不同情况下的表现优于另一个。

尝试权衡您的优先事项。在匹配具有特定属性的 50 个节点时具有出色的性能对您来说是多么重要。用户(数十?数百万?)将拥有快速、安全的方法来创建广泛复杂的关系网络对您来说有多重要?一旦确定了对您来说重要的是什么,请参考性能测试并确定哪个数据库更适合您的需求。

如果您要执行基本查询,您可能应该使用关系数据库模型,如 sql。 Neo4j 非常适合复杂的模式和查询,不仅从性能角度来看,而且从可读性角度来看。

Neo4j 以非常不同的方式存储数据,因此存在磁盘存储差异。

Cypher 以图形模式为中心,这些图形模式是您的用例的核心,并将它们直观地表示为查询语法的一部分。

This article 非常有见地,展示了从关系数据库到图形数据库的过渡。

【讨论】:

  • 我觉得你是对的,但是我们需要选择单个节点的时间呢,可能需要很长时间?例如,假设那些是我的社交网络数据库中的 cmets,我想根据它的 id 选择一个,或者是一个帖子,我想选择一个。据我所知,对于许多关系来说,幸好 NEO4J 比关系数据库快得多,但我问的是单个节点
  • 如果您需要基于单个标准选择数据,您需要使用条件、索引、关系等进行优化。在 Neo4J 中,基于单个任意属性匹配大堆需要一段时间, SQL 会更快。在这种特殊情况下,SQL 的表现要好。
  • 想想日产 GTR 和一级方程式赛车之间的比较。 GTR 很棒,它是一台了不起的机器,但是如果您将 GTR 与一级方程式赛车在各种比赛条件下相互对抗,那么 F1 赛车将会把日产汽车吹走。在您的测试用例中,您正在比较并行停车的能力。 GTR 在这里打勾,但您并没有充分利用两台机器的功能、功能和技术。我会鼓励你把踏板踩到金属上。
【解决方案2】:
  1. 您是否在testLabel 和属性random_id 上创建了索引?
  2. 您看到磁盘使用率相当高,因为事务日志默认保留 7 天,有一个配置选项可以对此进行调整。

一般来说:仅查找单个节点并不是对图形数据库的合理性能测试。您可能应该在几个连接之后进行一些查询以查看差异。

【讨论】:

  • 他说 MySQL 和 NOE4J 都没有表和属性(字段)的索引,那么两者必须具有相同的速度或 NEO4J 必须更快。并且索引使 NOE4J 比这更重!
  • 我同意@NasserGhiasi,正如我之前所说的,我喜欢NEO4J,它使用简单。但是我们甚至需要一个节点来使用它。我的意思是,例如我们想选择一个用户并查看他的信息或类似的东西!关于事务日志,它们是临时的,只是为了限制大小而不是大大小而存储。 NEO4J 数据库大小约为 35 GB,比 MySQL 多 6.7 GB。 + 我不是 MySQL 的粉丝,我只是不明白为什么 NEO4J 这么重,为什么在同样的情况下它不快!
  • Neo4J 的关系数据建模比 sql 复杂得多。不使用索引是对工具的不公平比较,本质上没有利用这些工具的功能进行比较。
  • 那么你同意我的观点,NEO4J 在相同条件下比 MySQL 慢,并且没有索引来获取一行(节点)?
  • 由于您的用例根本不是面向图形的——您只是在查找一个没有索引的节点——针对这种操作优化的另一种技术可能具有更高的性能。然而,由此得出的结论是“neo4j 比 mysql 慢”是错误的和误导性的。只需在更大的桌子上加入几次......就像法拉利可能不是赢得越野比赛的合适汽车一样。
猜你喜欢
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2012-03-23
相关资源
最近更新 更多