programing

mysql 대비 neo4j 성능 (어떻게 개선할 수 있습니까?)

goodsources 2023. 9. 18. 21:19
반응형

mysql 대비 neo4j 성능 (어떻게 개선할 수 있습니까?)

그래프 데이터베이스와 neo4j의 액션 북에서 성능 주장을 재현/검증할 없는 후속 조치입니다.설정 및 테스트를 업데이트했는데 원래 질문을 너무 바꾸고 싶지 않습니다.

전체 이야기(대본 등 포함)는 https://baach.de/Members/jhb/neo4j-performance-compared-to-mysql 에 있습니다.

짧은 버전: '그래프 데이터베이스' 책에서 언급된 성능 주장을 확인하려고 시도하는 동안 다음과 같은 결과를 얻었습니다(n명의 사람이 포함된 랜덤 데이터 세트를 쿼리하고 각 50명의 친구가 있음).

My results for 100k people

depth    neo4j             mysql       python

1        0.010             0.000        0.000
2        0.018             0.001        0.000
3        0.538             0.072        0.009
4       22.544             3.600        0.330
5     1269.942           180.143        0.758

"*": 단판만

My results for 1 million people

depth    neo4j             mysql       python

1        0.010             0.000        0.000
2        0.018             0.002        0.000
3        0.689             0.082        0.012
4       30.057             5.598        1.079
5     1441.397*          300.000        9.791

"*": 단판만

64비트 ubuntu에서 1.9.2를 사용하여 neo4j.properties를 다음과 같은 값으로 설정했습니다.

neostore.nodestore.db.mapped_memory=250M
neostore.relationshipstore.db.mapped_memory=2048M

그리고 neo4j-graphics.conf with:

wrapper.java.initmemory=1024
wrapper.java.maxmemory=8192

neo4j에 대한 내 쿼리는 다음과 같습니다(REST api 사용).

start person=node:node_auto_index(noscenda_name="person123") match (person)-[:friend]->()-[:friend]->(friend) return count(distinct friend);

Node_auto_index가 분명히 있습니다.

neo4j의 속도를 높이기 위해 내가 할 수 있는 일이 있습니까(mysql보다 빠르기 위해)?

또한 스택 오버플로우에는 동일한 문제를 가진 또 다른 벤치마크가 있습니다.

결과를 재현하지 못해서 유감입니다.그러나 2GB 힙, GCR 캐시가 있지만 캐시 워밍이 없고 비슷한 크기의 데이터셋(1백만 사용자, 1인당 50명의 친구)을 사용하여 다른 튜닝이 없는 MacBook Air(1.8GHz i7, 4GB RAM)에서는 1.9.2의 Traversal Framework를 사용하여 약 900ms를 반복적으로 얻을 수 있습니다.

public class FriendOfAFriendDepth4
{
    private static final TraversalDescription traversalDescription = 
         Traversal.description()
            .depthFirst()
            .uniqueness( Uniqueness.NODE_GLOBAL )
            .relationships( withName( "FRIEND" ), Direction.OUTGOING )
            .evaluator( new Evaluator()
            {
                @Override
                public Evaluation evaluate( Path path )
                {
                    if ( path.length() >= 4 )
                    {
                        return Evaluation.INCLUDE_AND_PRUNE;
                    }
                    return Evaluation.EXCLUDE_AND_CONTINUE;

                }
            } );

    private final Index<Node> userIndex;

    public FriendOfAFriendDepth4( GraphDatabaseService db )
    {
        this.userIndex = db.index().forNodes( "user" );
    }

    public Iterator<Path> getFriends( String name )
    {
        return traversalDescription.traverse( 
            userIndex.get( "name", name ).getSingle() )
                .iterator();
    }

    public int countFriends( String name )
    {
        return  count( traversalDescription.traverse( 
            userIndex.get( "name", name ).getSingle() )
                 .nodes().iterator() );
    }
}

사이퍼는 느리지만, 당신이 제안하는 것만큼 느린 곳은 없습니다: 약 3초:

START person=node:user(name={name})
MATCH (person)-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->(friend)
RETURN count(friend)

안부의 말

이언

네, REST API가 일반 바인딩보다 상당히 느려서 성능 문제가 있다고 생각합니다.

언급URL : https://stackoverflow.com/questions/17822333/neo4j-performance-compared-to-mysql-how-can-it-be-improved

반응형