2023年6月21日发(作者:)
ThinkPHP5⽔平分表后分页查询解决⽅案ThinkPHP5内置了partition⽅法,可⽤于实现简单的分表。新增,修改,删除,查询单条数据时,⽤partition⽅法都可以轻松搞定,因为这些操作有⼀个共同的特点,就是能事先明确的知道,我要操作的是哪⼀条记录。但有⼀个需求,ThinkPHP5似乎没有解决,⽐如当⼀个⼤表,被拆分成若⼲个⼦表时,如何根据相关条件及排序获取分页数据。这种需求场景下,由于事先并不知道哪些数据会出现在第⼀页,哪些数据会出现在第⼆页,这些根据检索条件动态匹配的列表数据,该如何查询呢?⼀次失败的尝试最先想到的也是最直接的⼀种⽅式,就是将partition⽅法和paginate⽅法结合起来,看似顺理成章的事,结果悲剧了,数据库被搞得直接奔溃。究其原因,要想实现分页查询,partition⽅法中需要union若⼲个⼦表,⽽且每个union的⼦表中,都是select * 的形式,这样就会严重影响到查询的效率,况且,在获取记录总数的时候,也完全没必要查询出所有字段。成功之道既然select * 会影响效率,那么select 出主键会怎样呢?当然是相当的快!总体思路就是分两次获取数据,第⼀次先查询出主键,然后第⼆次,根据主键,获取对应的数据。具体实现如下:核⼼思想⽔平分表后,当需要分页获取数据时,效率会变得⾮常低下,
2023年6月21日发(作者:)
ThinkPHP5⽔平分表后分页查询解决⽅案ThinkPHP5内置了partition⽅法,可⽤于实现简单的分表。新增,修改,删除,查询单条数据时,⽤partition⽅法都可以轻松搞定,因为这些操作有⼀个共同的特点,就是能事先明确的知道,我要操作的是哪⼀条记录。但有⼀个需求,ThinkPHP5似乎没有解决,⽐如当⼀个⼤表,被拆分成若⼲个⼦表时,如何根据相关条件及排序获取分页数据。这种需求场景下,由于事先并不知道哪些数据会出现在第⼀页,哪些数据会出现在第⼆页,这些根据检索条件动态匹配的列表数据,该如何查询呢?⼀次失败的尝试最先想到的也是最直接的⼀种⽅式,就是将partition⽅法和paginate⽅法结合起来,看似顺理成章的事,结果悲剧了,数据库被搞得直接奔溃。究其原因,要想实现分页查询,partition⽅法中需要union若⼲个⼦表,⽽且每个union的⼦表中,都是select * 的形式,这样就会严重影响到查询的效率,况且,在获取记录总数的时候,也完全没必要查询出所有字段。成功之道既然select * 会影响效率,那么select 出主键会怎样呢?当然是相当的快!总体思路就是分两次获取数据,第⼀次先查询出主键,然后第⼆次,根据主键,获取对应的数据。具体实现如下:核⼼思想⽔平分表后,当需要分页获取数据时,效率会变得⾮常低下,
发布评论