如何优化或组合这些MySQL查询?

时间:2009-09-16 19:48:41

标签: php sql mysql optimization

我想检查users表中的用户名。
如果找到了,那么我想获得id
否则,我想将用户名作为新记录插入,然后获取id
这是我的代码:

<?PHP
$sql = "SELECT id FROM users where username = '$username'";
$query = mysql_query($sql) or die(mysql_error());
$result = mysql_num_rows($query);
if($result){
    $row = mysql_fetch_array($query);
    $userid = $row["id"];
}else{
    $sql = "insert into users set username = '$username'";
    $query = mysql_query($sql) or die(mysql_error());
    $userid = mysql_insert_id();
}
?>

如何优化或组合这些MySQL查询?

我可以在同一个查询中选择并插入吗?

会更好更快吗?

2 个答案:

答案 0 :(得分:1)

如果您希望快速确定,请确保索引username

答案 1 :(得分:0)

最好先INSERT,假设用户名不存在。如果任何错误是由重复冲突引起的,SELECT现有行。

<?php
$sql = "INSERT INTO users SET username = '" 
  . mysql_real_escape_string($username) . "'";
$query = mysql_query($sql);
if ($query === true) {
    $userid = mysql_insert_id();
} else {
    if (mysql_errno() != 1022) { // this is the duplicate key error code
        die(mysql_error());
    }
    $sql = "SELECT id FROM users where username = '"
      . mysql_real_escape_string($username) . "'";
    $query = mysql_query($sql) or die(mysql_error());
    $row = mysql_fetch_array($query);
    if ($row !== false) {
        $userid = $row["id"];
    }
}
?>

更好的原因是如果你选择插入,其他人可能会在你的两个SQL语句之间插入用户名。

当然,UNIQUE上应该有users.username约束。


重新评论:是的,你的脚本应该更快。如果没有重复的用户名(可能更常见),则不必运行SELECT

优化SQL查询的最佳方法是不运行它。