【问题标题】:PHP select the biggest `id` value from MySQL tablePHP 从 MySQL 表中选择最大的 `id` 值
【发布时间】:2012-03-16 09:50:36
【问题描述】:

我有一个超过 300 000 行的表,我需要为“id”列选择最大值。通常,我会这样做:

SELECT id FROM my_table ORDER BY id DESC

...但这会导致查询缓慢,我不想使用它。有没有不同的方法来解决这种情况? id 是自增主键。

稍后编辑:我的完整代码似乎写得很糟糕,因为我从你的 cmets 中扣除了。下面我发布了我正在工作的代码示例和表格。您能否建议一种将 table_x 的最后一个 ID+1 插入两个表(包括 table_x 本身)的正确方法。我不得不提一下,该脚本将运行不止一次。

TABLE_X          TABLE_Y
------------     ----------
id_x | value     id_y | id_x
------------     ----------
   1 | A            1 | 3
   2 | B            
   3 | C

<?php
for($i=0; $i<10; $i++){
    $result_x = mysql_query('SELECT id_x FROM table_x ORDER BY id_x DESC');
    $row_x = mysql_fetch_array($result_x);

    $next = $row_x['id_x'] + 1;
    mysql_query('INSERT INTO table_x(id_x) VALUES("'.$next.'")');
    mysql_query('INSERT INTO table_y(id_x) VALUES("'.$next.'")');
}
?>

【问题讨论】:

  • 嗯,SELECT MAX(id) as id FROM my_table。 id 是一个 auto_increment PK,因此被索引,所以这应该非常快。
  • 我需要知道最大的 ID 是多少才能插入值为 ID+1 的下一行
  • @CosminEpureanu 如果列是您所说的 auto_increment,则永远不需要手动计算值以插入新行。事实上,这样做会导致竞争条件。
  • @Michael,我需要在两个表中插入 ID。我修改了我的帖子,请看一下。

标签: php mysql select


【解决方案1】:

稍微好一点:

SELECT id FROM my_table ORDER BY id DESC LIMIT 1

明显更好:

SELECT MAX(id) FROM my_table

【讨论】:

    【解决方案2】:

    这是您必须使用的正确代码。

    mysql_query('INSERT INTO table_x(id_x) VALUES(NULL)');
    $id = mysql_insert_id();
    mysql_query("INSERT INTO table_y(id_x) VALUES($id)");
    

    【讨论】:

    • 哦,这太容易了。是的,我必须使用 mysql_insert_id()。谢谢!
    • 自动增量功能旨在自动使用,而不是手动使用。否则你会破坏你的数据库一致性。总是让数据库分配id
    【解决方案3】:

    视上下文而定

    SELECT id FROM my_table ORDER BY id DESC LIMIT 1
    

    在 PHP 中是 mysql_insert_id(),在 MySQL 中是 (SELECT LAST_INSERT_ID())

    【讨论】:

    • LAST_INSERT_ID() 是特定于连接的,因此仅在非常特殊的情况下才有用。
    • @SteAp 当然。虽然它必须比搜索max() 快​​得多。没有必要在这里投反对票。
    • 啊,好的,我现在明白你的评论了。磨碎的!请在您的答案中注明 - 我将再次投票。如果只是为我解锁这个答案的投票。
    • @SteAp 同样,它依赖于上下文,你不能在任何地方使用它。 OP 没有提到他需要对 id 做什么以及什么时候做,所以这是一个很好的建议。显然它不能与其他资源一起使用。
    • 我建议用更多细节来增强“上下文”这个词。无论如何,除非您以某种方式编辑答案,否则我无法投票赞成-)由于我的反对票,它已为我锁定。
    【解决方案4】:

    正如其他人所说,您应该使用 MAX 运算符:

    SELECT MAX( id ) FROM my_table ORDER BY id DESC
    

    作为一般经验法则,始终减少从数据库返回的记录数量。在对结果集进行操作时,数据库总是比您的应用程序更快

    如果查询慢,请尝试EXPLAIN

    EXPLAIN  SELECT id FROM my_table ORDER BY id DESC
    

    对比

    EXPLAIN  SELECT MAX( id ) FROM my_table ORDER BY id DESC
    

    解释询问 MySQL 的查询优化器它是如何看待查询的。查看文档,了解如何阅读其输出。

    PS:我真的很想知道,为什么你需要MAX(id)。即使您的应用程序从数据库中取回了值,它也是无用的:另一个进程可能就在下一个 CPU 周期插入了一条新记录 - 而MAX(id) 不再有效。

    【讨论】:

    • 我需要在两个表中插入ID,我找不到合适的解决方案。我修改了我的帖子,你可以看看吗?谢谢!
    • 首先,插入主记录并将mysql_insert_id()的结果保存在一个变量中。然后在接下来的两个插入语句中使用这个永久有效的插入 ID。全部在一个脚本中。
    【解决方案5】:

    我想这很慢,因为您检索了所有 300 000 行。在查询中添加LIMIT 1

    SELECT id FROM my_table ORDER BY id DESC LIMIT 1
    

    或者使用 MAX() 运算符。

    【讨论】:

      猜你喜欢
      • 2013-10-20
      • 2023-02-06
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2013-10-06
      • 2012-01-10
      相关资源
      最近更新 更多