그래서이 쿼리를 지원하지 않는 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
멀티 쿼리의 속도 저하는 디스크 액세스에서 비롯된 것이라고 생각합니다. 더 많은 수의 항목을 선택하면 더 빠를 것입니다.하지만 (틀릴 수도 있습니다) ... 테스트 할 것입니다. 그것 1K 항목 이상 –
@ JoranBeasley - 데이터베이스에서 1k 항목은 거의입니다. – jordanm
@JoranBeasley 원래 쿼리 8.8에 비해 쿼리를 사용하는 것보다 배열 조작을 사용하면 1000 레코드 대 50을 얻는 것이 10 배 더 빠르다는 것을 알 수 있습니다. 따라서 적은 쿼리와 더 많은 원시 O (n) 조작이 빠릅니다. – MasterGberry