MySQL Select&限制计算复杂性

时间:2017-03-18 06:20:10

标签: mysql select sql-order-by complexity-theory sql-limit

假设我有一个像这样定义的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)),因为“限制”和“排序依据”在选择后执行?

有没有更好的方法从自动递增的表中选择最后一条记录?

2 个答案:

答案 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;

以下是输出: analyze

“行”告诉您查询迭代了多少行,“ r_rows”是结果行。
这就是我想要的。
我的印象是“ limit”关键字可以优化查询。不是。

另一方面,您也可以使用MAX()获取最后一行

 analyze
 select * from comment where commentid=(select max(commentid) from comment);

analyze max

主要查询显然只迭代1行,但是子查询应该是两者中最复杂的选择,因此我对其进行了分析:

 analyze
 select max(commentid) from comment;

给我: max result

除了“额外”说明(“选择经过优化的表格”)之外,这并没有告诉我太多信息。

我抬起头来,它已经是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';

innoDB version

PS:您可能想知道是否要这样做:

ALTER TABLE comment AUTO_INCREMENT = 999;

进行优化。
答案是否定的,不是,将AUTO_INCREMENT设置为某个值只会影响下一个条目。
尝试一下,修改AUTO_INCREMENT值,然后运行

select max(commentid) from comment;

您仍然会获得正确的值。