因此,当我准备转移到不支持此功能的Cassandra时,我正在从查询中删除联接,而是支持许多select语句。我在我的mysql表(我目前正在使用的)中对50行数据进行了基准测试,结果是101个查询(全部选择),完成所有这些查询需要大约0.035秒。然后我将其更改为一些数组操作(目前在PHP中)并将其减少为3个查询,其中包含一堆O(n)for循环。
我假设我的系统是在PHP,Python,MySQL还是Cassandra(NoSQL)上,使用一些O(n)for循环处理数据的速度要快得多,而不是更多的查询,我已经减少了使用这种新方法从0.035s到0.004s的时间如下所示。
任何替代方法可以缩短此范围吗?还是我走在正确的轨道上?在任何情况下运行所有查询的速度都会更快(除非它变为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 :(得分:3)
使用Cassandra,您可以使用multi get在一个查询中询问所有键,这比一堆单个查询要快得多。我有时会在查询中询问数千个密钥,响应时间实际上是即时的。
答案 1 :(得分:0)
有越来越多的工具,比如playOrm(也有一个原始的ad-hoc工具即将推出)支持只在表(而不是整个表)的分区上加入BUT,并在后台使用nosql模式进行索引。检查宽行模式,看看它是否对您有用。 IT有时可以帮助加快速度。