分页少了数据,这个是因为链表,排序的时候没有加上主键

本文探讨了在使用链表进行数据排序时,忽略主键导致的数据缺失问题。通过对比错误与正确的SQL写法,强调了在orderby语句中包含主键对于确保数据完整性和正确排序的重要性。

分页少了数据,这个是因为链表,排序的时候没有加上主键

如我做链表,排序字段是,a.sort,
错误写法是 order by a.sort
正确写法是 order by a.sort,a.id

### 普通分页的实现原理及数据库底层机制 普通分页是一种常见的数据检索方式,主要用于从大规模数据集中提取部分记录供前端展示。其实现涉及 SQL 查询语句的设计以及数据库内部的工作流程。 --- #### 1. **SQL 分页查询的基本形式** 在关系型数据库中,最常用的分页方法是通过 `LIMIT` 和 `OFFSET` 关键字实现。其基本语法如下: ```sql SELECT column_name(s) FROM table_name ORDER BY some_column LIMIT number_of_rows OFFSET offset_value; ``` - `LIMIT`:指定每次查询返回的最大行数。 - `OFFSET`:跳过前面若干行后再开始返回结果。 这种模式简单直观,适用于中小规模的数据集[^2]。 --- #### 2. **分页查询的执行过程** 当一条带有 `LIMIT` 和 `OFFSET` 的 SQL 被发送到数据库时,服务器会按照以下步骤处理请求: - **全表扫描或索引扫描** 数据库首先根据 `WHERE` 条件(如果有)筛选出满足要求的所有记录集合。如果没有过滤条件,则可能需要对整个表进行扫描[^2]。 - **排序操作** 接下来依据 `ORDER BY` 子句规定的顺序排列这些记录。注意这一步可能会消耗较多资源尤其是当目标列未建立适当索引的情况下[^4]。 - **截取所需片段** 最后按照给定的偏移量 (`OFFSET`) 和限制数目(`LIMIT`) 截取出对应的部分作为最终输出。 --- #### 3. **数据库底层机制分析** 为了更深入理解分页背后的运作机理,还需探讨几个关键技术点: ##### (1)**存储引擎的作用——以 InnoDB 为例** InnoDB 是 MySQL 默认使用的存储引擎之一,在分页场景下表现出色主要得益于以下几个特性: - **聚簇索引(Clustered Index)** 主键构成的 B+Tree 结构仅加快了定位速度还减了随机 IO 开销因为相邻主键对应的物理地址往往靠近彼此有助于连续读取效率提升. - **缓冲池(Buffer Pool)** 经常访问的数据页面会被加载入内存区域即所谓的 Buffer Pool 当再次遇到相同或者相似查询时候可以直接命中避免反复触碰硬盘从而显著降低延迟时间. ##### (2)**页(Page)的概念及其意义** 正如之前提到过的那样 Page 表示的是 InnoDB 内部用来组织管理数据的基本单位大小固定一般为16KB .每当新增一行数据都会尝试将其插入现有空闲空间足则开辟新的Page 同样删除也会释放相应容量形成碎片化现象所以长期频繁增删改动作容易引起性能衰退问题因此定期维护很有必要[^2]. ##### (3)**双链表与单链表的应用** 除了上述宏观层面外微观细节同样值得关注比如我们知道每个Page 内部各行之间采用单向链接相互串联起来便于快速遍历而同Level Pages间则是依靠双向链条维持上下级关联方便跳跃式导航极大简化了复杂查询路径规划难度提升了响应速率. --- #### 4. **潜在缺陷与改进方向** 尽管基于 `LIMIT`/`OFFSET` 的传统做法易于理解和部署但仍存在一些局限之处值得我们思考并寻找解决方案: - **随着Offset增大性能急剧恶化** 因为每一次都需要先丢弃前N条再选取M条尤其面对百万级以上的大表很容易造成严重的性能瓶颈为此业界提出了诸如Keyset Pagination 或者 Offset-Free Techniques 等新型算法试图缓解这一矛盾局面[^2]. - **缺乏全局视野难以预估总量** 很多情况下客户端希望知道总共多页才能合理安排UI界面此时单纯依赖单一Query无法达成目的于是衍生出了Count(*)辅助统计功能过它本身也可能成为另一个耗时环节故需谨慎权衡利弊决定是否启用[^1]. --- ### 结论 综上所述,普通分页借助简单的 SQL 构造实现了便捷的数据分割展现然而背后却隐藏着复杂的交互逻辑涵盖了从高层API调用直至底层硬件指令序列转换等多个层次的内容只有全面掌握各个环节的知识才能够真正做到游刃有余地应对各种挑战情景. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值