【问题标题】:How can I optimize or combine these MySQL queries?如何优化或组合这些 MySQL 查询?
【发布时间】:2009-09-16 19:48:40
【问题描述】:

我想检查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 查询?

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

它会更好更快吗?

【问题讨论】:

  • 这对我来说不是瓶颈,除非您的用户表真的很大。

标签: php sql mysql optimization


【解决方案1】:

如果您希望这更快,请确保您索引username

【讨论】:

    【解决方案2】:

    最好先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 语句之间插入用户名。

    当然你应该对users.username 有一个UNIQUE 约束。


    您的评论:是的,它应该比您的脚本更快。当没有重复的用户名(这可能更常见)时,您不必运行SELECT

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多