🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,优快云博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年优快云博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
文章目录
🚀前言
数据库分页是指将大量数据按照一定的规则分成若干页,每页只显示固定数量的数据,以方便用户浏览和管理数据。常见的规则是按照数据的主键或排序字段进行分页,通过控制每页的数据量和当前显示的页码,用户可以在整个数据集中浏览到所需的数据。数据库分页通常用于网站、移动应用程序等数据密集型应用中,以提高用户体验和系统性能。
数据库分页的瓶颈主要有以下几个方面:
-
数据库查询性能:分页操作需要进行 LIMIT 和 OFFSET 的查询操作,当数据量较大时,查询效率会显著降低,因此需要优化查询语句或使用索引提高查询效率。
-
网络传输性能:当数据量较大时,数据库查询结果需要通过网络传输到前端应用程序,如果网络传输速度慢或带宽较小,则会影响用户体验。
-
应用程序性能:大量的分页操作会占用大量的内存和 CPU 资源,可能会导致应用程序的性能下降或者出现崩溃等问题。
-
数据库锁定问题:对于高并发的系统,分页操作可能会导致数据库锁定,从而影响其他用户的访问和操作。
因此,在进行数据库分页操作时,需要考虑以上瓶颈问题并进行相应的优化,以保证系统的性能和稳定性。
本文主要介绍DeveloperSharp的使用,DeveloperSharp是一个研发中大型项目必备的系统平台,也是一个低代码平台。
它主要包括了如下一些功能:
- 基于Sql语句、存储过程、事务、分页的数据库操作。并几乎支持市面上所有种类的数据库。
- 图片操作。裁剪、缩放、加水印。
- http请求调用(Post与Get)
- 高效分页
- Web服务/WebApi的负载均衡
- 数据库的负载均衡,以及读写分离
- CORS跨域访问
- UUID全球通用唯一识别码
- MQ消息队列(请另行使用DeveloperSharp.RabbitMQ包)
- Redis缓存(请另行使用DeveloperSharp.Redis包)
- “异种数据库”的负载均衡
- 其他相关功能
🚀一、DeveloperSharp的使用
🔎1.数据库分页方案
数据库分页方案一般有两种:
- 使用 LIMIT 和 OFFSET 实现分页
在 SQL 语句中使用 LIMIT 和 OFFSET 子句,可以限制查询结果的数量和偏移量,实现分页效果。例如:
SELECT * FROM table_name LIMIT 10 OFFSET 20
上述语句表示从 table_name 表中获取 10 条记录,并从第 21 条记录开始获取(偏移量为 20),实现第三页的分页效果。这种方案适用于数据量较小的情况,但对于大数据量的查询效率会比较低。
- 使用游标(Cursor)实现分页
游标实际上是一个指向查询结果的指针,可以通过向前或向后移动来遍历查询结果。使用游标进行分页,可以避免在数据库中查询大量数据,提高查询效率。例如:
DECLARE @PageSize INT = 10
DECLARE @PageNum INT = 3
DECLARE @StartRow INT = (@PageNum - 1) * @PageSize + 1
DECLARE @EndRow INT = @PageNum * @PageSize
DECLARE @Cursor CURSOR
SET @Cursor = CURSOR SCROLL FOR
SELECT * FROM table_name ORDER BY id
OPEN @Cursor
FETCH ABSOLUTE @StartRow FROM @Cursor
WHILE @@FETCH_STATUS = 0 AND @@CURSOR_ROWS <= @EndRow
BEGIN
-- 处理查询结果
FETCH NEXT FROM @Cursor
END
CLOSE @Cursor
DEALLOCATE @Cursor
上述语句表示查询 table_name 表中第三页(每页 10 条记录),使用游标遍历查询结果。这种方案适用于数据量较大的情况,但对于性能会有一定要求。
🔎2.数据库和代码交互方案
数据分页往往有三种常用方案。
-
把数据库中存放的相关数据,全部读入代码/内存,再由代码对其进行分页操作。
-
直接在数据库中对相关数据进行分页操作,再把分页后的数据输出给代码程序。
-
先把数据库中的相关数据全部读入“缓存”,再由代码程序对“缓存”中的数据进行读取+分页操作。
本文下面重点阐述第一种与第二种两个解决方案,它们也都是直接基于“数据库”的。
🦋2.1 基于内存分页
☀️2.1.1 安装包
DeveloperSharp
☀️2.1.2 使用
using DeveloperSharp.Extension;
--------------------------
var Page1 = DataAll.PagePartition(20, 5);
其中,要被分页的DataAll对象可以是List、IQueryable、IEnumerable、等任何集合类型。
PagePartition方法的第一个参数是“页大小”,第二个参数是“页序号”,即:PagePartition(int pageSize, int pageIndex)
分页后的返回值Page1的类型是:PagePiece<IEnumerable>,它包含分页后的数据集、总页数、总数据、当前页码、等等一系列“分页”后经常会用到的数据。PagePiece<IEnumerable>对象内包含的属性的详细说明如下:
DataList
声明:public IEnumerable<T> DataList;
用途:IEnumerable<T> --当前页的数据
PageSize
声明:public int PageSize;
用途:int --页面大小
TotalPageNumber
声明:public int TotalPageNumber;
用途:int --总页数
TotalRecordNumber
声明:public int TotalRecordNumber;
用途:int --记录总数
CurrentStartIndex
声明:public int CurrentStartIndex;
用途:int --当前页的记录起始编号
CurrentEndIndex
声明:public int CurrentEndIndex;
用途:int --当前页的记录结束编号
CurrentPageSize
声明:public int CurrentPageSize;
用途:int --当前页的记录数量
CurrentPageIndex
声明:public int CurrentPageIndex;
用途:int --当前页码
🦋2.2 基于数据库分页
☀️2.2.1 创建数据源类
数据源类主要是用来与数据库进行通信的,必须继承自DeveloperSharp.Structure.Model.DataLayer类 。
using DeveloperSharp.Framework.QueryEngine;
using DeveloperSharp.Structure.Model;
namespace ConsoleTest
{
//数据源类
[DataSource(DatabaseType.SQLServer, "Server=localhost;Database=DB_SY_Formal;Uid=sa;Pwd=1")]
public class TestData : DeveloperSharp.Structure.Model.DataLayer
{
//类中没有任何代码
}
}
☀️2.2.2 使用
using ConsoleTest;
using DeveloperSharp.Extension;
TestData td = new TestData();
//分页(从第162*20后取20页)
var pp = td.PagePartition("select top 5000 * from MO", 20, 162);
List<dynamic> Products = pp.Table.ToList<dynamic>();
foreach (var P in Products)
{
Console.WriteLine(P.DOC_NO);
}
Console.ReadLine();
☀️2.2.3 PagePartition方法说明
此处的PagePartition方法有两个重载方法,其详细功能说明如下:
PagePartition
声明:public PagePiece PagePartition(string RecordSet, string Id, int PageSize, int PageIndex)
用途:分页功能(有主键)
参数:(1)string RecordSet --需要分页的记录集,可以是表、视图、或者SQL语句
(2)string Id --主键
(3)int PageSize --页面大小
(4)int PageIndex --当前页码
返回:PagePiece --页片实体
PagePartition
声明:public PagePiece PagePartition(string RecordSet, int PageSize, int PageIndex)
用途:分页功能(无主键)
参数:(1)string RecordSet -- 需要分页的记录集,可以是表、视图、或者SQL语句
(2)int PageSize --页面大小
(3)int PageIndex --当前页码
返回:PagePiece --页片实体
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”