ThinkPHP5水平分表后分页查询解决方案

thinkphp5内置了partition方法,可用于实现简单的分表。新增,修改,删除,查询单条数据时,用partition方法都可以轻松搞定,因为这些操作有一个共同的特点,就是能事先明确的知道,我要操作的是哪一条记录。但有一个需求,thinkphp5似乎没有解决,比如当一个大表,被拆分成若干个子表时,如何根据相关条件及排序获取分页数据。

这种需求场景下,由于事先并不知道哪些数据会出现在第一页,哪些数据会出现在第二页,这些根据检索条件动态匹配的列表数据,该如何查询呢?

一次失败的尝试

最先想到的也是最直接的一种方式,就是将partition方法和paginate方法结合起来,看似顺理成章的事,结果悲剧了,数据库被搞得直接奔溃。究其原因,要想实现分页查询,partition方法中需要union若干个子表,而且每个union的子表中,都是select * 的形式,这样就会严重影响到查询的效率,况且,在获取记录总数的时候,也完全没必要查询出所有字段。

成功之道

立即学习“PHP免费学习笔记(深入)”;

既然select * 会影响效率,那么select 出主键会怎样呢?当然是相当的快!总体思路就是分两次获取数据,第一次先查询出主键,然后第二次,根据主键,获取对应的数据。具体实现如下:

核心思想

水平分表后,当需要分页获取数据时,效率会变得非常低下,拆分的子表越多,对查询性能的影响就会越大。所以核心思想就是,尽量通过主键id来获取对应的数据记录,也就是分两次来获取列表数据。

1. 先查询总记录数及主键id

该步骤中,union 子表的select语句中,只需要列出主键id和其它额外必须的字段即可,不相关的字段无需出现。

2. 根据主键id查询对应的完整数据。

函数封装

百度AI开放平台 百度AI开放平台

百度提供的综合性AI技术服务平台,汇集了多种AI能力和解决方案

百度AI开放平台 42 查看详情 百度AI开放平台

1. 构造获取总记录数及主键ID的sql子查询语句

/** * 构造获取总记录数及主键ID的sql子查询语句 * @param $table 主表名称 * @param $idKey 主键id字段名称 * @param string $fields 其它字段名称,多个字段用英文逗号分隔 * @param int $num 子表数量 * @param string $where 查询条件 * @return array */function buildPartitionSql($table,$idKey,$fields='',$num=1,$where='') {    $countTable = [];    $listTable = [];    $fieldList = [$idKey];    if ($fields) {        $fieldList = array_merge($fieldList,explode(',',$fields));        $fieldList = array_unique($fieldList);    }    $fieldStr = implode(',',$fieldList);    for ($i = 0; $i  $countTable, 'listSql' => $listTable];    return $tables;}

调用方式:

假设buildPartitionSql函数的执行结果为$tables,那么完整的SQL语句如下:

获取总记录数的完整sql:

select count(1) as total from .$tables['countSql']

获取主键id的完整sql:

select * from .$tables['listSql']. limit 0,10

2. 构造获取指定id对应记录的sql子查询语句

/** * 构造获取指定id对应记录的sql子查询语句 * @param $table 主表名称 * @param $idKey 指定的id字段名称 * @param $idValues 指定的id字段值 * @param int $num 子表数量 * @return string */function buildPartitionListSql($table,$idKey,$idValues,$num=1) {    $sql = '';    $ids = is_array($idValues) ? implode(',',$idValues) : $idValues;    if ($ids) {        $listTable = [];        for ($i = 0; $i < $num; $i++) {            $listTable[] = sprintf('SELECT * FROM %s_%s where %s in (%s)', $table, ($i + 1), $idKey, $ids);        }        $sql = '( ' . implode(" UNION ", $listTable) . ') AS ' . $table;    }    return $sql;}

调用方式:

假设buildPartitionListSql函数的执行结果为$sql,那么完整的SQL语句如下:

select * from .$sql

注意:业务层面的所有检索条件,都放在了第一步的union子句中,第二步只需要根据id拿数据就行了。

创想鸟,大量的免费thinkphp入门教程,欢迎在线学习!

以上就是ThinkPHP5水平分表后分页查询解决方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/361727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 03:09:26
下一篇 2025年11月6日 03:10:40

相关推荐

  • 一文讲解thinkphp5如何进行异步验证邮箱

    thinkphp框架教程栏目将给大家介绍thinkphp5使用bootstrapvalidator进行异步验证邮箱的方法,希望对需要的朋友有所帮助! TP5使用bootstrapvalidator进行异步验证邮箱 Remusic Remusic – 免费的AI音乐、歌曲生成工具 514 …

    2025年11月27日 PHP框架
    000
  • thinkphp5如何开启错误调试

    thinkphp5如何开启错误调试?方法如下: 方法一、在application下面的配置文件config.php中把调试模式改为true。 相关推荐:《ThinkPHP教程》 立即学习“PHP免费学习笔记(深入)”; 方法二、在应用的ROOT_PATH目录下面定义.env文件,并且定义APP_DE…

    2025年11月25日 PHP框架
    000
  • 详解ThinkPHP5实现极验滑动验证码geetest功能

    下面由thinkphp教程栏目给大家详解thinkphp5实现极验滑动验证码geetest功能,希望对需要的朋友有所帮助! ThinkPHP5实现极验滑动验证码geetest功能 现在很多网站,比如淘宝,京东等都改用使用极验拖动验证码实现登录,这种方式比传统的验证码方式有更好的体验,减少用户输入的错…

    2025年11月25日 PHP框架
    000
  • 解析ThinkPHP5如何引入Go AOP和PHP AOP编程

    ThinkPHP5 引入 Go AOP,PHP AOP编程 项目背景 目前开发的web软件里有这一个功能,php访问api操作数据仓库,刚开始数据仓库小,没发现问题,随着数据越来越多,调用api时常超时(60s)。于是决定采用异步请求,改为60s能返回数据则返回,不能则返回一个异步id,然后轮询是否…

    2025年11月25日 PHP框架
    000
  • thinkphp5是什么

    thinkphp v5.0是一个为api开发而设计的高性能框架——是一个颠覆和重构版本,采用全新的架构思想,引入了很多的php新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对api开发做了大量的优化。  ThinkPHP5是一个全新的里程碑版本,包括路由、日志、异常…

    2025年11月23日
    000
  • thinkphp3和thinkphp5的区别

    thinkphp3和thinkphp5的区别?下面给大家介绍一下两者的不同之处: 一、thinkphp3.2和thinkphp5之间的使用差异 1、过去的单字母函数已完全被替换掉,如下: S=>cache,C=>config,M/D=>model,U=>url,I=>i…

    2025年11月23日
    000
  • thinkphp5多语言怎么切换

    thinkphp5多语言进行切换的步骤: 第一步,在配置文件中开启多语言配置。 第二步,创建多语言目录。 立即学习“PHP免费学习笔记(深入)”; 相关推荐:《ThinkPHP教程》 第三步,编写语言包。 视图代码: 控制器代码: 效果如下: 以上就是thinkphp5多语言怎么切换的详细内容,更多…

    2025年11月23日 PHP框架
    000
  • thinkPHP5如何使用rabbitmq

    thinkPHP5如何使用rabbitmq? 安装好 tp5 的 rabbitmq 扩展后,在项目根目录文件添加文件 rabbitmq.php 引导启动 rabbitmq。 <?phpdefine('APP_PATH', __DIR__ . '/applicati…

    2025年11月23日
    000
  • thinkphp5如何读取配置文件的数据

    首先打开编辑器sublime。 然后找到应用目录下的config文件。 立即学习“PHP免费学习笔记(深入)”; 相关推荐:《ThinkPHP教程》 随便选取一个配置参数,比如我们想要读取配置参数app_namespace。 来到控制器里面。 在控制器里面新建一个方法test2。 在方法里面我们利用…

    2025年11月23日 PHP框架
    000
  • thinkphp5如何套用主题

    thinkphp5套用主题的方法: 配置项: ‘DEFAULT_THEME’=>’default’,//默认主题 ‘THEME_LIST’=>’default,theme’,//主题列表 ‘TMPL_DETECT_THEME’=>true//开启自动侦测模版主题 相关推荐:《Thi…

    2025年11月23日
    000
  • thinkphp5怎么上传图片

    前后台代码对应,前台的代码name对应后台的值,获取到需要上传的信息。 上传流程很简单,接收上传的信息,把数据用move方法传到指定位置,然后成功后回调就可以了,注意步骤: 立即学习“PHP免费学习笔记(深入)”; 相关推荐:《ThinkPHP教程》 自己封装的上传,接收传过来的name值,然后获取…

    2025年11月23日 PHP框架
    000
  • thinkphp5怎么做分页

    其实分页自身的内容也不是很多。不过牵扯到样式的问题感觉挺烦。于是找到了分页类看了一下。把大体的结构说一下。如果有需要修改页面样式的可以自行修改样式。最好提前备份,防止意外。 首先是分页的调用,tp5的调用相对非常容易: $mod = new appindexmodelBlogmsg();$mo = …

    2025年11月23日
    000
  • thinkphp5的优点是什么

    php框架有助于促进快速应用开发,不仅节省时间,有助于建立更稳定的应用,而且,减少了重复代码的开发。 通常认为PHP框架的作用相当于模型,控制器,视图。(mvc) 相关推荐:《ThinkPHP教程》 thinkphp5.0的优点 立即学习“PHP免费学习笔记(深入)”; ①中国人开发,更加符合我们的…

    2025年11月23日
    000
  • ThinkPHP5-使用 think-API 部署 JWT

    因为下一个项目要用 tp5 开发一个小程序,所以就使用到了,tp 框架,因为小程序开发需要后台来编写 api 接口,所以就上网查了一下有没有相关的依赖,在此推荐一下 think-api 扩展工具,因为主要想使用其中的 jwt 功能来判断小程序用户的登录状态,下面就以本人的项目为例,简单和大家聊一下,…

    2025年11月22日
    500
  • thinkphp5支持swoole携程吗

    首先,了解一下thinkphp的运行机制。 TP5运行机制: 任何请求都会经过tp5的入口文件,载入框架的配置文件,启动进程,然后处理请求。 在这个index.php的入口文件中,可以看到,它先定义的APP_PATH这个常量,然后引入的框架的启动文件start.php,那我们就去看下start.ph…

    2025年11月22日 PHP框架
    000
  • thinkphp5支持oracle吗

    首先,我们知道php是完全支持oracle的,那么作为php框架的thinkphp5也是完全可以支持oracle的。 thinkphp5如何连接oracle? 数据库:ray 表的结构:ray_user CREATE TABLE IF NOT EXISTS ray_user (user_id int…

    2025年11月22日
    000
  • thinkphp5有什么用

    thinkphp5有什么用? ThinkPHP5作用 ThinkPHP V5.0是一个为API开发而设计的高性能框架——是一个颠覆和重构版本,采用全新的架构思想,引入了很多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化。 Think…

    2025年11月22日
    000
  • thinkphp5如何调用云片接口实现发送短信验证码找回密码功能

    下面由thinkphp框架教程栏目给大家介绍thinkphp5如何调用云片接口实现发送短信验证码找回密码功能,希望对需要的朋友有所帮助! 思路: 1、用户输入手机号,请求获取短信验证码。2、thinkphp生成短信验证码,存储,同时和其他参数一起发送请求给云片。3、云片发送短信验证码到指定手机号。4…

    2025年11月17日 PHP框架
    000
  • thinkphp5清除缓存、模版缓存和日志缓存

    下面由thinkphp框架教程栏目给大家介绍thinkphp5清除缓存、模版缓存和日志缓存的方法,希望对需要的朋友有所帮助! 直接写入cache模块中,生成控制器 namespace appcachecontroller;use thinkController;use thinkCache; 具体方…

    2025年11月17日
    100
  • thinkphp5怎么隐藏index.php入口文件?

    隐藏方法:1、打开apache的http.conf配置文件,开启mod_rewrite.so模块;2、AllowOverride None项中将None改为All;3、修改“.htaccess”的配置内容,将原代码替换为官方手册提供的代码。 thinkphp现在的php主流框架之一,本篇文章介绍的是…

    2025年11月16日
    000

发表回复

登录后才能评论
关注微信