我对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
答案 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