2013-07-23 26 views
37

Đây là theo dõi tới can't reproduce/verify the performance claims in graph databases and neo4j in action books. Tôi đã cập nhật thiết lập và kiểm tra, và không muốn thay đổi câu hỏi gốc quá nhiều.hiệu suất neo4j so với mysql (làm thế nào nó có thể được cải thiện?)

Toàn bộ câu chuyện (kể cả kịch bản vv) là trên https://baach.de/Members/jhb/neo4j-performance-compared-to-mysql

phiên bản ngắn: trong khi cố gắng xác minh những tuyên bố hiệu suất thực hiện trong cuốn sách 'Graph Cơ sở dữ liệu' Tôi đến kết quả như sau (truy vấn một n bộ dữ liệu ngẫu nhiên có chứa người, với 50 bạn bè mỗi):

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 

"*": chạy duy nhất mà thôi

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 

"*": Độc thân chạy chỉ

Sử dụng 1.9.2 trên ubuntu 64bit Tôi có neo4j.properties thiết lập với các giá trị:

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

và neo4j-wrapper.conf với:

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

truy vấn của tôi để neo4j trông giống như này (sử dụng api REST):

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

Node_auto_index được đặt ra, rõ ràng là

Có điều gì tôi có thể làm để tăng tốc độ neo4j lên (nhanh hơn sau đó mysql) không?

Và cũng có another benchmark in Stackoverflow cùng một vấn đề.

Trả lời

4

Tôi rất tiếc vì bạn không thể tạo lại kết quả. Tuy nhiên, trên MacBook Air (1,8 GHz i7, RAM 4 GB) với bộ nhớ 2 GB, bộ đệm GCR, nhưng không có bộ đệm ấm và không có điều chỉnh khác, với bộ dữ liệu có kích thước tương tự (1 triệu người dùng, 50 người bạn trên mỗi người) , tôi liên tục nhận được khoảng 900 ms sử dụng Framework Traversal trên 1.9.2:

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()); 
    } 
} 

Cypher là chậm, nhưng không nơi nào gần như chậm như bạn đề nghị: xấp xỉ 3 giây:

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

Kind coi

ian

+2

Xin lỗi, kịch bản trong neo4j đang hoạt động là 'trả lại tất cả bạn bè của bạn bè ...', không tìm đường dẫn giữa bạn bè đã cho. Tôi đang đề cập đến chương 1 của Neo4j trong hành động. Các câu lệnh sql là về việc tìm kiếm tất cả bạn bè, và do đó là kết quả trong các bảng (các bản ghi được trả về). Và quan trọng hơn: Tôi hoàn toàn không thể tái tạo 3 giây. Truy vấn, ví dụ: 'start person = node (100) match (person) - [: friend] ->() - [: friend] ->() - [: friend] ->() - [: friend] -> (bạn) trả về đếm (bạn), 'mất 28,9 giây. Rất lạ ... –

+3

Và vâng: trên bộ dữ liệu 1m tìm đường đi giữa A và B cho khoảng 2390 ms trên mysql và chỉ khoảng 25ms trên neo4j. –

+0

aka neo4j thể hiện sức mạnh của nó khi nói đến các mối quan hệ truy vấn (đường dẫn) thay vì các nút, phải không? –

3

Có, tôi tin rằng API REST chậm hơn đáng kể so với các ràng buộc thông thường và trong đó có vấn đề hiệu suất của bạn.

+0

Điểm tốt.Vâng, tôi muốn tưởng tượng bạn sẽ nhận được kết quả khác nhau chạy nhúng vs độc lập (với một thủ tục/plugin). – yngwietiger

Các vấn đề liên quan