MySQL Select & 限制计算复杂度
MySQL Select & Limit computational complexity
假设我有一个 mysql table 定义如下:
create table test_table(
id int(10) unsigned auto_increment primary key
/*, other attributes...*/
);
鉴于 table 我想像这样从中获取最后一条记录:
select * from test_table order by id desc limit 1;
可以,但是感觉有点粗略,请问它的复杂度是多少?
它是 O(log(n)) 因为 "limit" 和 "order by" 是在 select 之后执行的吗?
是否有更好的方法 select 来自自动递增 table 的最后一条记录?
您也可以使用此方法获得所需的输出。
SELECT * FROM test_table where id=(select max(id) from test_table);
希望对您有所帮助。
我想我明白了。
我最初的问题与 "Select & Limit" 相关联,但实际上这适用于所有查询。
MySQL 提供了 "analyze" 关键字。
您可以在您的终端上调用它,然后执行您的查询;它将输出一些关于执行细节的元数据。
这是一个在我的问题中使用 table 的示例(我将其名称更改为 "comment" 并将其 PK 更改为 "commentid" 以提供一些上下文):
analyze
select * from comment order by commentid desc limit 1;
下面是输出:
"rows" 告诉您查询迭代了多少行,"r_rows" 是结果行。
这就是我要找的。
我的印象是 "limit" 关键字会以某种方式优化查询。它没有。
另一方面,您也可以使用 MAX() 获取最后一行
analyze
select * from comment where commentid=(select max(commentid) from comment);
主查询显然只迭代了1行,但是子查询应该是两者中最复杂的select,所以我分析了一下:
analyze
select max(commentid) from comment;
给我:
除了 "extra" 描述外,这并没有告诉我太多信息,它说:"Select tables optimized away".
我查了一下,已经是 answered question on stack
根据我目前收集到的信息,该描述意味着 MAX 实际上并不计算您的 table 的行数,而是使用由 sql 引擎管理的存储值.
仅当该列具有 "auto_increment" 时才有效。
接受的答案还说它只适用于 MyISAM tables,但我 运行 在 InnoDB table 上进行这些测试,并且优化似乎有效。
详情如下:
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;
你仍然会得到正确的值。
假设我有一个 mysql table 定义如下:
create table test_table(
id int(10) unsigned auto_increment primary key
/*, other attributes...*/
);
鉴于 table 我想像这样从中获取最后一条记录:
select * from test_table order by id desc limit 1;
可以,但是感觉有点粗略,请问它的复杂度是多少? 它是 O(log(n)) 因为 "limit" 和 "order by" 是在 select 之后执行的吗?
是否有更好的方法 select 来自自动递增 table 的最后一条记录?
您也可以使用此方法获得所需的输出。
SELECT * FROM test_table where id=(select max(id) from test_table);
希望对您有所帮助。
我想我明白了。
我最初的问题与 "Select & Limit" 相关联,但实际上这适用于所有查询。
MySQL 提供了 "analyze" 关键字。 您可以在您的终端上调用它,然后执行您的查询;它将输出一些关于执行细节的元数据。
这是一个在我的问题中使用 table 的示例(我将其名称更改为 "comment" 并将其 PK 更改为 "commentid" 以提供一些上下文):
analyze
select * from comment order by commentid desc limit 1;
下面是输出:
"rows" 告诉您查询迭代了多少行,"r_rows" 是结果行。
这就是我要找的。
我的印象是 "limit" 关键字会以某种方式优化查询。它没有。
另一方面,您也可以使用 MAX() 获取最后一行
analyze
select * from comment where commentid=(select max(commentid) from comment);
主查询显然只迭代了1行,但是子查询应该是两者中最复杂的select,所以我分析了一下:
analyze
select max(commentid) from comment;
给我:
除了 "extra" 描述外,这并没有告诉我太多信息,它说:"Select tables optimized away".
我查了一下,已经是 answered question on stack
根据我目前收集到的信息,该描述意味着 MAX 实际上并不计算您的 table 的行数,而是使用由 sql 引擎管理的存储值.
仅当该列具有 "auto_increment" 时才有效。
接受的答案还说它只适用于 MyISAM tables,但我 运行 在 InnoDB table 上进行这些测试,并且优化似乎有效。
详情如下:
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;
你仍然会得到正确的值。