2012-08-15 41 views
4

因此,我準備遷移到不支持此操作的Cassandra,而是支持許多選擇語句,因此我正在從查詢中刪除聯接。我對我的mysql表中的50行數據(我當前使用的)進行了基準測試,結果導致101個查詢(全部選擇),並且花費大約0.035秒來完成所有這些查詢。然後我改變了一些數組操作(目前在PHP中),並用一堆O(n)for循環將其縮減爲3個查詢。從數據庫檢索數據的最有效算法

我假設我的系統是在PHP,Python,MySQL還是Cassandra(NoSQL)上,使用幾個O(n)for循環來處理數據要快得多,而不是更多的查詢,如下所示,使用這種新方法將時間從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條目或更多 – 2012-08-15 17:27:02

+0

@JoranBeasley - 數據庫中的1k條目很少。 – jordanm 2012-08-15 17:39:47

+1

@JoranBeasley看起來,檢索1000條記錄與50條記錄相比,使用數組操作我比使用一堆查詢更快速10倍,而原始8.8與原始8.8相比,所以它顯然減少了查詢和更多原生O(n)操作更快。 – MasterGberry 2012-08-15 17:59:14

回答

3

隨着卡桑德拉你可以要求使用多弄,這比一堆單查詢快得多在一個查詢所有你的鑰匙。我有時會在查詢中詢問數千個密鑰,並且響應時間實際上是即時的。

0

有越來越多的工具,如playOrm(也有一個原始的臨時工具即將推出),它支持僅在表格分區(不是整個表格)上連接BUT,並在後臺使用nosql模式進行索引。查看寬行模式,看看它對你是否有用。 IT有時可以幫助加快速度。