我怎样才能优化以下代码?

时间:2014-07-19 21:34:11

标签: php mysql optimization

$project_query= $db->query("SELECT * FROM projects WHERE id='$task_info->project_id'");
$project_info = $project_query->fetch_object();
$admins_array = $project_info->admins_array;

$admins = unserialize($admins_array);
$is_admin = false;
foreach($admins as $value) {
if($value == $_SESSION['username']) { $is_admin = true; }
}

我有以下代码检查当前记录的用户的用户名是否包含在存储在mysql表行中的序列化数组中。我将如何优化它以获得最佳性能?

2 个答案:

答案 0 :(得分:1)

1)如果有可能更改数据库结构,我建议将序列化值存储在单独的表中

project_admins (project_id, user_id)(project_id,user_id)

上有唯一索引

然后,您可以快速确定用户是否是项目的管理员

SELECT 1 from project_admins where project_id = x and user_id = y

2)如果你坚持在db中存储序列化数据我建议存储由username索引的序列化数据 所以你可以在恒定时间内搜索

$is_admin = array_key_exists($_SESSION['username'],$admins);

3)如果你不能通过用户名索引admins数组,你可以通过在找到匹配后添加break语句来最小化你的循环

foreach($admins as $value) {
    if($value == $_SESSION['username']) { 
        $is_admin = true; 
        break; // match found no need to check remaining values
    }
}

实际上在这种情况下,您最好使用in_array

$is_admin = in_array($_SESSION['username'],$admins);

答案 1 :(得分:1)

如果它在速度方面是优化,那么我建议在SQL中执行登录。

要求您通过从序列化字符串切换到单独的相关实体,将表结构更改为更规范化的状态。