2012-08-15 3 views
4

그래서이 쿼리를 지원하지 않는 Cassandra로 이동할 준비가되면서 쿼리에서 조인을 제거하지만 대신 많은 SELECT 문을 지원합니다. 나는 나의 mysql 테이블 (현재 선택하고있는 것)에서 50 행의 데이터를 벤치 마크 테스트하여 101 개의 쿼리 (모두 선택)를 얻었으며이 쿼리를 모두 완료하는 데 ~ 0.035 초가 걸렸습니다. 나는 이것을 PHP (현재 PHP에서)의 배열 조작으로 바꾸고 루프를위한 O (n)의 묶음으로 3 개의 쿼리를 줄였습니다.데이터베이스에서 데이터를 검색하는 가장 효율적인 알고리즘

필자의 시스템이 PHP, Python, MySQL 또는 Cassandra (NoSQL)에 있는지 여부에 관계없이 훨씬 많은 쿼리가 아니라 몇 개의 O (n) 루프를 사용하여 데이터를 처리하는 것이 더 빠를 것이라고 가정합니다. 아래에 나와있는 것처럼이 새로운 방법을 사용하여 0.035 초에서 0.004 초로 시간을 줄였습니다.

더 줄이기위한 다른 방법은 없나요? 아니면 올바른 방향으로 가고 있습니까? 모든 쿼리를 실행하는 것이 더 빠르며 (O (n^2)가 될 때 외에는)? 감사합니다 :

// Now go through and get all of the user information (This is slower in mysql, but maybe faster in cassandra) 
     /*foreach ($results as $key => $row) 
     { 
      // Create query 
      $query = DB::select('id', 'username', 'profile_picture')->from('users')->where('id', '=', $row['uid']); 

      // Execute it 
      $results2 = $query->execute(null, false); 

      // Join it 
      $data[$key] = array_merge($row, $results2[0]); 
     }*/ 

     // Get all the user information (faster in mysql since less queries) 
     $uids = array(); 
     $ids = array(); 
     foreach ($results as $key => $row) 
     { 
      if (!in_array($row['uid'], $uids)) 
       $uids[] = $row['uid']; 
      if (!in_array($type, array('userProfile'))) 
       $ids[] = $row['comment_id']; 
     } 

     // Create query 
     $query = DB::select('id', 'username', 'profile_picture')->from('users')->where('id', '=', $uids); 

     // Execute it 
     $results2 = $query->execute(null, false); 

     $user_data = array(); 

     foreach ($results2 as $key => $row) 
     { 
      $user_data[$row['id']] = array('uid' => $row['id'], 'username' => $row['username'], 'profile_picture' => $row['profile_picture']); 
     } 

     foreach ($results as $key => $row) 
     { 
      $data[$key] = array_merge($row, $user_data[$row['uid']]); 
     } 
     // End faster user info section 
+0

멀티 쿼리의 속도 저하는 디스크 액세스에서 비롯된 것이라고 생각합니다. 더 많은 수의 항목을 선택하면 더 빠를 것입니다.하지만 (틀릴 수도 있습니다) ... 테스트 할 것입니다. 그것 1K 항목 이상 –

+0

@ JoranBeasley - 데이터베이스에서 1k 항목은 거의입니다. – jordanm

+1

@JoranBeasley 원래 쿼리 8.8에 비해 쿼리를 사용하는 것보다 배열 조작을 사용하면 1000 레코드 대 50을 얻는 것이 10 배 더 빠르다는 것을 알 수 있습니다. 따라서 적은 쿼리와 더 많은 원시 O (n) 조작이 빠릅니다. – MasterGberry

답변

3

카산드라 사용하면 단일 쿼리의 무리보다 훨씬 빠른 멀티 GET을 사용하여 하나 개의 쿼리에서 모든 키를 요청할 수 있습니다. 때로는 쿼리에서 수천 개의 키를 요청하고 응답 시간이 효율적입니다.

0

(전체 테이블이 아닌) 테이블의 파티션에서만 조인을 지원하고 장면 뒤에서 nosql 패턴을 사용하여 인덱싱을 수행하는 playOrm (원시 임시 도구 제공)과 같은 도구가 점점 더 많이 있습니다. 넓은 줄의 패턴을 확인하고 그것이 당신에게 유용한 지보십시오. IT가 때로는 일을 빠르게하는 데 도움이 될 수 있습니다.

관련 문제