CREATE TABLE users(
id integer PRIMARY KEY,
name varchar(50) NOT NULL,
pswd varchar(50) NOT NULL,
email varchar(50),
create_time timestamp NOT NULL,
notes varchar(200)
);
INSERT INTO users(id, name, pswd, email,create_time)
with recursive t(id, name, pswd, email,create_time)
as(
select 1,cast(concat("user",1) as char(50)),"e10adc3949ba59abbe56e057f20f883e",
cast(concat("user1","@qq.com") as char(50)),'2020-01-01 00:00:00'
union all
select id+1,cast(concat("user",id) as char(50)),"e10adc3949ba59abbe56e057f20f883e",
cast(concat("user",id,"@qq.com") as char(50)),create_time+ interval mod(id,2) minute
from t
where id<1000000
)
SELECT /*+ SET_VAR(cte_max_recursion_depth = 1M) */* FROM t;
-- offset行驶
select count(*)
from users
-- create index index_create_time on users(create_time)
-- 还没创建索引前,默认索引为ID 下面查询执行计划是全表扫描 因为没
-- 用到索引ID
explain select users.name,users.id from users
limit 20 offset 60000
-- type=all rows994039 key——len 全表扫描,行九十多万行,key_len长度为null
-- 使用了索引 id
explain select users.name,users.id from users
-- where id>800000
order by create_time, id
limit 20 offset 400000
-- type=index使用索引 rows800020 key——len 4 全表扫描,行800020 行,key_len长度为4一个
-- 索引字段为4字符长度
-- 提示
explain select users.name,users.id from users
order by id
limit 20 offset 80000800
-- 像这种type=all key——len 为null 全表扫描 key_len长度为null,因为有时候偏移量太大
-- 系统会觉得这么大的偏移量还不如全表扫描,直接不用索引来查询了
-- 重点 即使你创建了索引 如果你不使用索引字段,他也不会生效
-- 即使你创建了索引,偏移量太大也会等于没创建,因为系统觉得偏移量这么大还不如全表扫描
#keyset 无限下滚行驶 就是不知道下面多少 也不知道滚了多少数据
-- 这个好处就是查询的数据永远都是20
-- 这个模式就是每次查询都会返回最后一次的数据 然后在根据最后一次的数据
-- 作为where条件 尽量这两个条件都是索引 那么这样是效率最高的
-- 这样就保证每次查询都是20条 速度就非常快
-- 那么offset 0 就可以省略了
-- create index index_create_time on users(create_time) 没创建前 637ms
-- 创建后6ms
select * from users
where create_time > '2020-01-01 00:10:00' and id >20
order by users.create_time , id
limit 20 offset 0
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!
常见资源合集和破解beqptwpmc...