OFFSET复杂性InnoDB

时间:2014-07-03 10:33:24

标签: 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 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

1 个答案:

答案 0 :(得分:1)

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

town_id=69的索引搜索具有复杂度O(log 2 n ),因为它正在搜索B树。

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

您可以详细了解MySQL如何使用LIMIT优化查询:http://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html