【发布时间】:2021-11-14 09:22:54
【问题描述】:
我有一个分页查询,它对一个大表进行范围索引扫描:
create table t_dummy (
id int not null auto_increment,
field1 varchar(255) not null,
updated_ts timestamp null default null,
primary key (id),
key idx_name (updated_ts)
查询如下所示:
select * from t_dummy a
where a.field1 = 'VALUE'
and (a.updated_ts > 'some time' or (a.updated_ts = 'some time' and a.id > x)
order by a.updated_ts, a.id
limit 100
解释计划显示成本很高,rows 值非常高,但是,它使用了所有正确的索引并且执行似乎很快。有人能告诉我这是否意味着查询效率低吗?
【问题讨论】:
-
首先我想提一下,你创建的表和你引用的表是不一样的。关于查询成本的问题为什么不使用
a.updated_ts>='some time' and a.id>x可以帮助您优化查询的另一件事是尝试从查询中删除 order by 子句。 order by 子句会在查询的输出上产生开销,因为它首先根据updated_ts对输出进行排序,然后再次对id执行排序操作。希望你明白我想告诉你的意思。 -
感谢您指出不匹配。更正。我也喜欢 and 子句优化。但是我需要按该顺序对结果进行排序。
-
再想一想,AND 重构是不正确的@ShaktiK ;) 感谢您的回复
-
我认为他们的意思是和重构就像我的回答一样
标签: mysql pagination sql-execution-plan