PHP从MySQL表中选择最大的'id'值

PHP从MySQL表中选择最大的'id'值,php,mysql,select,Php,Mysql,Select,我有一个超过300000行的表,我需要为列“id”选择最高值。通常,我会这样做: SELECT id FROM my_table ORDER BY id DESC 。。。但这会导致查询速度变慢,我不想使用它。有没有其他办法来解决这种情况?id是自动递增的主键 后期编辑:我的完整代码似乎写得很糟糕,因为我从你的评论中扣除了。下面我发布了我正在处理的代码和表的示例。您能否建议一种正确的方法,将表_x的最后一个ID+1插入两个表中,包括表_x本身。我必须提到,脚本将运行不止一次 TABLE_X

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

SELECT id FROM my_table ORDER BY id DESC
。。。但这会导致查询速度变慢,我不想使用它。有没有其他办法来解决这种情况?id是自动递增的主键

后期编辑:我的完整代码似乎写得很糟糕,因为我从你的评论中扣除了。下面我发布了我正在处理的代码和表的示例。您能否建议一种正确的方法,将表_x的最后一个ID+1插入两个表中,包括表_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.'")');
}
?>

我想这很慢,因为您检索了所有300000行。将限制1添加到查询中

SELECT id FROM my_table ORDER BY id DESC LIMIT 1
或者使用MAX运算符。

稍微好一点:

SELECT id FROM my_table ORDER BY id DESC LIMIT 1
SELECT MAX(id) FROM my_table
明显更好:

SELECT id FROM my_table ORDER BY id DESC LIMIT 1
SELECT MAX(id) FROM my_table

也取决于上下文

SELECT id FROM my_table ORDER BY id DESC LIMIT 1

或者在PHP中,或者在MySQL中选择LAST_INSERT_ID,正如其他人所说,您应该使用MAX操作符:

SELECT MAX( id ) FROM my_table ORDER BY id DESC
根据一般经验,始终减少从数据库返回的记录量。在结果集上操作时,数据库总是比应用程序快

如果查询速度较慢,请尝试:

vs

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


PS:我真的很奇怪,为什么你需要MAXid。即使您的应用程序从数据库中获取了该值,它也是无用的:另一个进程可能刚好在下一个CPU周期中插入了一条新记录,并且MAXid不再有效。

以下是您必须使用的正确代码

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

嗯,从my_表中选择MAXid作为id。id是一个自动递增的PK,因此索引应该非常快。我需要知道最大的id是什么,以便插入下一行id值+1@CosminEpureanu如果该列如您所说是自动递增的,则永远不需要手动计算值来插入新行。事实上,这样做会导致竞争条件。@Michael,我需要在两个表中插入ID。我修改了我的帖子,请看一下。最后一个插入ID是特定于连接的,因此只有在非常特殊的情况下才有用。@SteAp当然。虽然它必须比搜索最大值快得多。没有必要在这里投票。啊,好的,我现在明白你的评论了。愤怒!请在你的答案中写一个便条,我将再次投票。如果只是为了解锁投票给我这个答案。@SteAp再说一遍,它是上下文相关的,你不能在任何地方都使用它。OP没有提到他需要对id做什么以及什么时候做,所以这是一个很好的建议。显然,它不能与其他资源一起使用。我建议用更多的细节来增强“上下文”一词。无论如何,除非你以某种方式编辑你的答案,否则我无法投票它对我来说是锁定的-由于我的否决票。我需要在两个表中插入ID,但我找不到合适的解决方案。我修改了我的帖子,你能看一下吗?谢谢首先,插入主记录并将mysql\u insert\u id的结果保存在变量中。然后在接下来的两个inset语句中使用此永久有效的insert ID。全部在一个脚本中。哦,太简单了。是的,我必须使用mysql\u insert\u id。谢谢!自动增量功能旨在自动使用,而不是手动使用。否则将破坏数据库一致性。始终让数据库分配id