检查单个MySQL记录是否存在的有效方法?

时间:2011-12-15 04:15:53

标签: php mysql performance

需要根据db中记录的存在执行一些逻辑。由于这个功能会经常被调用,我想知道以下是否可以提高效率...

另请注意,该表是一个关联表(employee_id和department_id一起形成一个复合主键),因此只有一条记录符合条件。

例如:

<?php

    function checkEmpDptAssoc($employee_id, $department_id)
    {
        $sqlQuery = sprintf("SELECT COUNT(*)
                             FROM  employee_department ed
                             WHERE ed.employee_id = '%d'
                             AND   ed.department_id = '%d'",
                             $employee_id,
                             $department_id);

        $result = mysql_query($sqlQuery);
        $row = mysql_fetch_assoc($result);

        if ((int) $row['COUNT(*)'] > 0) {
            return true;
        } else {
            return false;    
        } 

    }
?> 

3 个答案:

答案 0 :(得分:4)

EXISTS可能会更快一点,因为您只需确保一个存在。

SELECT 1 FROM DUAL
WHERE EXISTS (
    SELECT *
    FROM  employee_department ed
    WHERE ed.employee_id = '%d'
        AND   ed.department_id = '%d'
)

答案 1 :(得分:1)

也许你可以试试:

"SELECT ed.employee_id
 FROM  employee_department ed
 WHERE ed.employee_id = '%d'
 AND   ed.department_id = '%d'
 LIMIT 1"

由于您只需要检查是否存在单个记录,因此可能:

if (!empty($row)) {
    return TRUE;
} else {
    return FALSE;
}

[编辑:根据@ ColShrapnel的评论,我遗憾地忘记了]

# instead of above if...else condition:
return empty($row);

抱歉,我现在没有时间对此进行测试,但我可以说的是,如果您希望提高性能(将count()limit放在一边),请​​从看看你是否可以在where子句中为列或两列添加索引,employee_iddepartment_id ..如果employee_id应该是唯一的,请将其设为唯一索引例如:

-- non unique    
create index idx_employeeid on table(employee_department)

-- unique
create unique index idx_employeeid_unq on table(employee_department)

答案 2 :(得分:0)

what I am always talking about

的完美示例

一个问题,绝对无处不在 关于一切非常重要的事情,关于一切的答案 一个可怜的孤独评论,这个问题唯一明智的答案。

您唯一需要关注的是正确索引 问题的其余部分,所有这些语法问题,运行THE SAME查询的各种变体都没有。

我能想到的唯一改进就是摆脱不必要的代码 选择1而不是计数(*),然后你可以只做

    return (bool)mysql_fetch_assoc($result);

它不会影响代码的性能,但可能会影响编码器的性能。