gpt4 book ai didi

MySQL 选择和限制计算复杂度

转载 作者:行者123 更新时间:2023-11-29 03:21:57 26 4
gpt4 key购买 nike

假设我有一个这样定义的 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))因为“limit”和“order by”是在select之后执行的?

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

最佳答案

我想我明白了。
我最初的问题与“选择和限制”有关,但这实际上适用于所有查询。

MySQL 提供了“analyze”关键字。您可以在您的终端上调用它,然后执行您的查询;它将输出一些关于执行细节的元数据。

这是在我的问题中使用表格的示例(我将其名称更改为“comment”并将其 PK 更改为“commentid”以提供一些上下文):

 analyze
select * from comment order by commentid desc limit 1;

下面是输出: analyze

“rows”告诉你查询迭代了多少行,“r_rows”是结果行。
这就是我要找的。
我的印象是“limit”关键字会以某种方式优化查询。它没有。

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

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

analyze max

主查询显然只迭代了1行,但是子查询应该是两者中最复杂的select,所以我分析了一下:

 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;

您仍然会得到正确的值。

关于MySQL 选择和限制计算复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42871211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com