2014-04-30 2 views
0

mysql과 node.js.를 사용하고 있습니다. 나는 두 명의 사용자의 채팅을로드하기 위해 '이전 채팅로드'버튼이 있습니다. 버튼을 클릭하면 @ 12 라인/초 (수동으로 테스트)의 결과가 나타납니다. 어떻게 빨리 처리 할 수 ​​있습니까? 내 응용 프로그램은 스카이프 반면 12 개 라인/초 @ 결과를주고 나는 더를 최적화 할 수있는 방법최소한의 시간에 데이터베이스에서 데이터 가져 오기

socket.on('chatHistoryMaintain', function(data){ 
    for(i=0;i<data.sum;i++) 
    { 
     if(data.result[i].sender==data.nickname) 
     { 
      $('#chat-messages ul').append('<li class="marker"><div class="fl sender">'+nickname+' : </div><div class="fl text1">'+data.result[i].msg+'</div></li>'); 
     } 
     else 
     { 
      $('#chat-messages ul').append('<li class="marker"><div class="fl receiver">'+nickname+' : </div><div class="fl text">'+data.result[i].msg+'</div></li>'); 
     } 
    } 
}); 

을 - 다음은 서버 사이드 -

socket.on('chatHistory', function(data){ 
    var count=0; 
    connection.query("SELECT * FROM chatRecord WHERE uniqueRoomId = '"+data.roomId+"' ", function(err, result, fields) { 
     if (err) throw err; 


     for (var j in result) 
     { 
      if (rows3.hasOwnProperty(j)) count++; 
     } 
     var k=0; 
     if(result[0]) 
     { 
      socket.emit('chatHistoryMaintain', {result:result,sum:count,nickname:data.nickname}); 
     } 
    }); 
    }); 

클라이언트 측 코드에 내 코드

입니다 1560 라인/초만큼 빠름? 내가 뭘 잘못하고있어? 여기

내 데이터베이스 엔진

의 세부 사항입니다
>  +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 
>  | Engine    | Support | Comment              | Transactions | XA | Savepoints | 
>  +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 
>  | PERFORMANCE_SCHEMA | YES  | Performance Schema            | NO   | NO | NO   | 
>  | MRG_MYISAM   | YES  | Collection of identical MyISAM tables       | NO   | NO | NO   | 
>  | MEMORY    | YES  | Hash based, stored in memory, useful for temporary tables  | NO   | NO | NO   | 
>  | BLACKHOLE   | YES  | /dev/null storage engine (anything you write to it disappears) | NO   | NO | NO  
> | 
>  | MyISAM    | YES  | MyISAM storage engine           | NO   | NO | NO   | 
>  | CSV    | YES  | CSV storage engine            | NO   | NO | NO   | 
>  | ARCHIVE   | YES  | Archive storage engine           | NO   | NO | NO   | 
>  | FEDERATED   | NO  | Federated MySQL storage engine         | NULL   | NULL | NULL  | 
>  | InnoDB    | DEFAULT | Supports transactions, row-level locking, and foreign keys  | YES   | YES | YES  | 
>  +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 
+0

몇 가지 이유가있을 수 있습니다. uniqueRoomId 열에 색인이 있습니까? chatRecord에는 몇 행이 있습니까? 데이터베이스가 사용하는 엔진은 무엇입니까? 귀하는 귀하의 질의에 대한 설명을 게시 할 수 있습니까? 서버의 하드웨어에 대한 자세한 정보가 있습니까? – Peavey

+0

예 uniqueRoomId에 색인이 있습니다. chatRecord에는 30,000 개의 행이 있습니다. 데이터베이스 엔진 세부 사항에 대한 내 질문을 편집했습니다. 서버 하드웨어에 대해 무엇을 알고 싶습니까? – Vardan

+0

@Peavey 어떤 생각? – Vardan

답변

1

있는지 확인하려면 먼저

  1. 사용 EXPLAIN에서 속도가 느린 이유는 빨리 먼저 발견해야한다 있도록하기 위해 사용자의 쿼리는 행 검색을 수행하거나 인덱스 및 어떤 쿼리를 사용하고 있습니다.
  2. EXPLAIN 출력으로 괴롭히는 경우 SELECT COUNT(*)...과 같은 WHERE 절을 대신 사용해보십시오. 그것이 너무 느린 경우에, 색인은 아마 문제이다. 문제는 당신의 인덱스를 조정, 행 스캔을하고 쿼리에있는 경우 CLI 클라이언트에서 쿼리를 수행하면 그 느린

입니다

  • 확인합니다. mysql이 데이터를 찾는 것이 문제가 아니라 오히려 반환하는 경우 모든 30k 레코드가 소켓을 통해 펌핑되어 모든 것을 한 번에 반환 할 때까지 기다리지 마십시오. official doc에 설명 된대로 비동기로 행을 가져 오는 것이 좋습니다 (결국 node.js입니다!). node.js 프로세스 메모리에 많은 레코드를 한꺼번에 넣는 것은 좋은 생각이 아니므로 프로세스의 메모리 사용을 모니터링 해 볼 수 있습니다.

  • 관련 문제