Mysql 偏移复杂性InnoDB

Mysql 偏移复杂性InnoDB,mysql,time-complexity,Mysql,Time Complexity,我对InnoDB中的OFFSET的复杂性有疑问。我知道这主要适用于线性复杂度,但如果我在字段上有索引 例如: CREATE TABLE `person_rand` ( `p_id` int(6) NOT NULL PRIMARY KEY, `town_id` int NOT NULL, KEY p_town (town_id), CONSTRAINT `fk_perrand` FOREIGN KEY (p_id) REFERENCES person_data(p_id) on updat

我对InnoDB中的
OFFSET
的复杂性有疑问。我知道这主要适用于线性复杂度,但如果我在字段上有索引

例如:

CREATE TABLE `person_rand` (
 `p_id` int(6) NOT NULL PRIMARY KEY,
 `town_id` int NOT NULL,
 KEY p_town (town_id),
 CONSTRAINT `fk_perrand` FOREIGN KEY (p_id) REFERENCES person_data(p_id) on update cascade on delete cascade
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
和查询

SELECT p_id FROM person_rand WHERE town_id=69 LIMIT 1 OFFSET 666
那么执行这个查询的速度有多快?在固定的时间里,它不会工作吗

EXPLAIN SELECT p_id FROM person_rand WHERE town_id=69 LIMIT 1 OFFSET 666
每次都显示另一行数

id  select_type     table           type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE          person_rand     ref     p_town          p_town    4         const   950     Using index

EXPLAIN中显示的行数只是基于InnoDB表统计信息的估计数。不要把它当作一个精确的数字

town_id=69
的索引搜索具有复杂性O(log2n),因为它正在搜索一个B-树

通常,将
限制
与偏移一起使用具有线性复杂性。在您的示例中,它必须生成667行的结果集,然后才能跳过666的偏移量以获得偏移量后面的1行


您可以阅读更多关于MySQL如何使用
LIMIT
优化查询的信息:

预先编写一个
EXPLAIN
并亲自查看?我已经编辑了这篇文章。每次它向我显示另一行数。
EXPLAIN从person\u rand中选择p\u id,其中town\u id=69 LIMIT 1
在固定时间内也不起作用,但我有一个键。。