因此,我準備遷移到不支持此操作的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
我認爲大多數來自多個查詢的減速來自於磁盤訪問......我認爲隨着大量的條目你會發現選擇更快......(但我可能是錯的)......我會測試它帶有1k條目或更多 – 2012-08-15 17:27:02
@JoranBeasley - 數據庫中的1k條目很少。 – jordanm 2012-08-15 17:39:47
@JoranBeasley看起來,檢索1000條記錄與50條記錄相比,使用數組操作我比使用一堆查詢更快速10倍,而原始8.8與原始8.8相比,所以它顯然減少了查詢和更多原生O(n)操作更快。 – MasterGberry 2012-08-15 17:59:14