Db.findFirst为什么要先查询出所有记录再取第一条,而不是在语句后加limit或top来实现,这样在大数据量情况下不会影响效率吗

如题image.png


评论区

杜福忠

2018-01-30 16:19

SQL 不是你自己传进来的吗? 写sql 的时候自己不写 limit 1的吗? 如果框架自动把limit 1追加到sql里面, 外面的代码sql不易读吧。。。

JFinal

2018-01-30 21:12

看一下你的截图中的第一行注释: recommend add "limit 1" in your sql

这个当然是要添加 limit 1 的, jfinal 没有为你的 sql 额外添 limit 1 在当年主要是如下考虑:
1:不同数据库对于限定返回数据的数量方言不同,例如,有些是使用 limit ,有些是使用 top,当时为了省事就没处理不同的方言

2:对于大部分使用 findFirst 的场景来说,都有 where 条件用在 id 上,而 id 是天然排序过的,所以不会有性能问题,例如: select * from user where id = 123

3:findFirst 这个做法始于 7 年前的第一个版本,用户量上来以后,再考虑添加 limit 1 或者 top 1 这样的处理,会有较大的兼容风险

总的来说,还是findFirst 做得不是很周到,对于不在索引条件上的查询,确实有性能风险

Jfinal1234

2018-01-31 10:40

@JFinal 好的,多谢波总

热门反馈

扫码入社