关于分页只能写 sql 的痛苦

2022-08-06 01:59:20 +08:00
 garyxi24
由于现在公司项目都是在数据库分页,只能写 sql 实现而且只能是一条 sql 。本人是个 sql 菜鸡,简单筛选还好说,复杂逻辑筛选用 sql 写就很痛苦,好不容易怼出来 sql 像💩一样,又臭又长,同样的逻辑如果内存分页比如用 java 去实现就可以很清晰、很舒服。
所以我是想请教一下有什么更好的分页方式,摆脱写 sql 的噩梦,上 es Hadoop spark flink 这些大数据生态组件?
6512 次点击
所在节点    MySQL
61 条回复
akira
2022-08-06 02:07:28 +08:00
那就换成用 java 去写咯。。。
thinkershare
2022-08-06 03:28:10 +08:00
学会写 SQL, 可以不写, 但不可以不会.
另外 SQL 只要不使用 join 和子查询, 再复杂能复杂到哪儿去.
现在大部分数据库都支持原生的分页, 写分页已经足够简单.
总不可能将数据全部查询到内存, 然后调用内存排序,然后 skip/take 吧...
LeegoYih
2022-08-06 03:46:04 +08:00
我觉得 ORM 能解决你的痛点,比如 JPA ,而不是 MyBatis 。

像 Elasticsearch 这种,分页性能更差,基本上都不用分页,通常用滚动搜索。
garyxi24
2022-08-06 03:46:30 +08:00
@thinkershare “另外 SQL 只要不使用 join 和子查询, 再复杂能复杂到哪儿去”,复杂不就在这两个地方吗,或者说在于主表和其他表的关联上,纯单表当然没那么复杂了
chihiro2014
2022-08-06 03:53:02 +08:00
JPA 包治百病
garyxi24
2022-08-06 03:53:35 +08:00
@LeegoYih jpa 也只适用简单过滤吧,复杂过滤还是要写原生 sql 吧
LeegoYih
2022-08-06 04:06:24 +08:00
@garyxi24

现在很少写 join 和子查询,因为数据库基本都是分库分表,或者是微服务物理隔离的,所以 JPA 比较合适。

如果不是这种场景,需要手写复杂 SQL ,可以尝试一下 MyBatis 分页插件,比如:MyBatis-PageHelper 、MyBatis-Plus ,但是这俩插件在一些场景下可能会有 Bug ,而且代码质量也堪忧。

也可以参考我写的分页插件: https://github.com/yihleego/mypages
使用了 ANTLR4 分析语法树,支持多种使用场景。
sadfQED2
2022-08-06 06:41:19 +08:00
我好奇,如果不在数据库分页,难道还有其他地方可以分页吗?难道你以前都是把数据加载到程序里面,然后用程序分页?

另外,SQL 分页的难点在哪?举个例子看看
Cbdy
2022-08-06 07:59:13 +08:00
用 es
liaohongxing
2022-08-06 08:05:44 +08:00
建议放弃编程 ,写个 sql 都能成痛苦 。
bthulu
2022-08-06 08:08:52 +08:00
自己参考 mybatis 分页插件写个小工具, 用于将你写的任意 sql 转换为带分页的 sql, 这样你就只管写不分页的 sql, 写完了用小工具处理下就好了
chendy
2022-08-06 08:16:03 +08:00
楼主的分页是有多复杂?
就算是手撸分页也就是在 sql 里按数据库的语法加上 skip 和 limit 的参数就完事了
还是说查询条件太多还分散在各个表,拼起来难受?
catcn
2022-08-06 08:40:01 +08:00
你把分页抽取成一个通用的方法不就可以了。
noparking188
2022-08-06 09:40:18 +08:00
找个 SQL Builder 库
keepeye
2022-08-06 09:51:22 +08:00
这个世界不由 java 主导一切
seliote
2022-08-06 09:52:53 +08:00
能理解,尤其是涉及到属性对象过滤分页这样的,没什么好办法,数据不多就内存手动分页
james2013
2022-08-06 09:54:16 +08:00
我用 java 也是在数据库分页的,多表 join 也是这样
怎么可能在内存分页呢?
lscho
2022-08-06 09:56:36 +08:00
不明白 sql 分页有什么难的,不就 limit 吗。

而且内存分页是第一天写代码吗?数据量大了咋内存分页啊。
tairan2006
2022-08-06 09:58:14 +08:00
写 SQL 是基本技能…Flink/ES 甚至最新的 MongoDB(atlas),都回到 SQL 上了。

当然,如果只是分页的需求,用插件就可以了…
nothingistrue
2022-08-06 10:04:09 +08:00
你发在了 mysql 区,而 mysql 分页只需要简单的在最外层末尾加上 limit first,max 即可。这你都痛苦,那遇见 oracle 的分页你得自杀。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX