假设我有一个像这样定义的mysql表:
create table test_table(
id int(10) unsigned auto_increment primary key
/*, other attributes...*/
);
鉴于那张桌子,我想从中获取最后一条记录:
select * from test_table order by id desc limit 1;
它有效,但感觉有点粗略,它的复杂性是什么? 是否为O(log(n)),因为“限制”和“排序依据”在选择后执行?
有没有更好的方法从自动递增的表中选择最后一条记录?
答案 0 :(得分:1)
您也可以使用此方法获得所需的输出。
SELECT * FROM test_table where id=(select max(id) from test_table);
希望,这会对你有帮助。
答案 1 :(得分:0)
我想我明白了。
我最初的问题与“选择并限制”有关,但实际上这适用于所有查询。
MySQL提供了“ analyze”关键字。 您可以在终端上调用它,然后执行查询;它将输出一些有关执行细节的元数据。
这是在问题中使用表格的示例(我将其名称更改为“ comment”,将其PK更改为“ commentid”以提供一些上下文):
analyze
select * from comment order by commentid desc limit 1;
“行”告诉您查询迭代了多少行,“ r_rows”是结果行。
这就是我想要的。
我的印象是“ limit”关键字可以优化查询。不是。
另一方面,您也可以使用MAX()获取最后一行
analyze
select * from comment where commentid=(select max(commentid) from comment);
主要查询显然只迭代1行,但是子查询应该是两者中最复杂的选择,因此我对其进行了分析:
analyze
select max(commentid) from comment;
除了“额外”说明(“选择经过优化的表格”)之外,这并没有告诉我太多信息。
我抬起头来,它已经是answered question on stack
根据我到目前为止所收集的描述,这意味着MAX实际上并不计算表的行数,而是使用由sql引擎管理的存储值。
仅当列具有“ auto_increment”时,它才有效。
接受的答案还说,它仅适用于MyISAM表,但是我正在InnoDB表上运行这些测试,并且优化似乎正在起作用。
以下是详细信息:
SELECT PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_TYPE_VERSION, PLUGIN_LIBRARY, PLUGIN_LIBRARY_VERSION, PLUGIN_AUTHOR
FROM information_schema.PLUGINS
WHERE PLUGIN_NAME = 'innodb';
PS:您可能想知道是否要这样做:
ALTER TABLE comment AUTO_INCREMENT = 999;
进行优化。
答案是否定的,不是,将AUTO_INCREMENT设置为某个值只会影响下一个条目。
尝试一下,修改AUTO_INCREMENT值,然后运行
select max(commentid) from comment;
您仍然会获得正确的值。