如何设计数据库排序字段

最简单的办法就是按照id进行排序,越小的id排序越前,不过这完全没有灵活性可言,所以

int字段作为排序

采用一个额外的int字段作为排序成为更普遍的方式

考虑现实场景中,很多时候是需要进行中间插入排序的,这意味要求将插入位置之后的,全部更新排序,那么这显然并非一个好办法

连成链表吧

这种对后面所有值进行改变的操作,让我们很容易想起来数组,想到数组,也很容易联想到链表,那么完全可以参照链表的设计方法,记录指向前后元素

这样做的优势与链表一致,新增、修改、删除的成本都很低。代价则是查询的成本过高。

想要取出排序好的数据,要么通过很复杂的sql语句实现,要么将所有数据取出来作为链表进行排序

有间隙的数据类型

回到int字段的思路,转变一下思路,完全可以使用一个有间隙的类型。比如浮点数、decimal、甚至字符串

具体思考如下

  • 浮点数:浮点精度上容易出现问题

    不过这可以通过刻意设计,使得插入的排序数字符合精度。

    索引效率低

  • decimal:可能占用更多字节,计算更为复杂,新增、更新、删除也会更慢

  • 字符串:与decimal有同样的问题,关键是排序并不直观

从本地实际测试来看100w级数据,浮点、decimal、字符串索引都是很快的,在100ms内

给int加间隔

进一步考虑,既然是需要间隙,那么其实在最初的排序int数字之间增加固定的间隔,其实也是可以的。

显然这也不是万全之策,如果间隔太大,很容易超范围,如果间隔太小,又很容易无法支持插入了

配置化与缓存

此外在数据量不大的情况下,还可以在配置文件中配置排序,或者在缓存储存排序

最后,我的想法

  • 在很少会有中间插入或者对查询排序有较高要求的情况:较短间隔的int是更优的方法

  • 在中间插入情况较多的时候:可能float类型更为合适

    链表方法在插入情况较多的时候也是非常适用的,可是查询性能属实太差

  • 数据量少:可以用配置文件或者直接在缓存中设置排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Numpy 数组及矩阵创建详解

基本数组创建方式 numpy中的主要数据类型为ndarray类型,也可以称之为数组,其在内存中是连续存储的.numpy底层大多C语言进行编写,所以运行效率较高,并且numpy库支持并行计算,如矩阵乘法以及其他线性代数操作 np.array() np.array()是numpy中最为基础和常用的创建数组的方式,其…

HUD杂散光环境模拟测试设备

概述 HUD(Head-Up Display)杂散光环境模拟测试设备是用于模拟飞行器在实际运行过程中可能遇到的多种光照环境的系统。它主要用于测试和验证HUD显示系统的性能,确保其能在各种光线条件下清晰、准确地显示信息,从而保障飞行员在复杂…

redis面试(二十六)总结

到这里 redis的相关知识就要告一段落了,给前面的系列文章做一下大致的总结。 前四篇是redis底层数据结构实现逻辑剖析,四、五两篇说的是持久化和淘汰策略,后面大量篇幅讲的都是redis锁相关。 其他相关的一些面试问题,之前也发过…

深入了解Cassandra数据库:原理、架构与最佳实践

一、Cassandra的基本原理与架构 1.1 分布式架构 Cassandra的架构是无中心化的,这意味着每个节点在集群中都是平等的,没有单一的主节点。这种设计确保了系统的高可用性,即使在部分节点失效的情况下,集群依然可以正常运行。Cassan…

MySQL——多表操作(四)(2)带 EXISTS 关键字的子查询

EXISTS 关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试,坏产生任何数据,只返回 TRUE 或 FALSE,当返回值为 TRUE 时,外层查询才会执行。 例如,查询 employee 表中是否存在年龄大于 21岁的…

集成电路学习:什么是BLE低功耗蓝牙

一、BLE:低功耗蓝牙 BLE,即低功耗蓝牙(Bluetooth Low Energy),也被称为蓝牙4.0,是蓝牙技术的一种变体。BLE的主要特点在于其低功耗特性,旨在通过一系列的技术和优化措施,使得设备能够…

【大模型理论篇】通用大模型架构分类及技术统一化

1. 背景 国内的 “百模大战” 以及开源大模型的各类评测榜单令人眼花缭乱,极易让人陷入迷茫。面对如此众多的大模型,我们该如何审视和选择呢?本文将从大模型架构的角度,对常见的开源大模型架构进行汇总与分析。资料来源于公开…

MySQL——多表操作(三)连接查询(1)交叉连接

在关系型数据库管理系统中,建立表时各个数据之间的关系不必确定,通常将每实体的所有信息存放在一个表中,当查询数据时,通过连接操作查询多个表中的实体信息,当两个或多个表中存在相同意义的字段时,便可以通…

2024全国大学生数学建模国赛,成员如何分工协作?

文末获取2024国赛数学建模思路代码,9.5开赛后第一时间更新 大家知道,数学建模竞赛是需要一个团队的三个人在三天或四天的时间内,完成模型建立,编程实现和论文写作的任务,对许多第一次参加建模或者建模经验比较欠缺的团…

Vue3.0教程001:Vue3简介

0、前言 编码规范: 在Vue3中 编码语言:JavaScript、TypeScript**(推荐)**代码风格:组合式API**(推荐)**、选项式API简写形式:setup语法糖 主要内容: 核心:ref…

线性代数基础

向量的点积 点乘和叉乘 矩阵乘法 规则: 1,两个矩阵相乘时,第一个矩阵的列数必须等于第二个矩阵的行数 矩阵乘法是点乘还是叉乘 矩阵点乘:是矩阵各个对应元素相乘, 这个时候要求两个矩阵必须同样大小。矩阵叉乘:矩…

Android 使用原生相机Camera在预览界面进行识别二维码或者图片处理

1 项目需求 最近项目中有个需求:使用原生相机在预览界面进行识别二维码和图片处理。其实这个需求不是很难,难在对预览画面的处理过程。 自己针对这个需求写了一个工具类,便于后续进行复盘,同时也分享给有类似需求的伙伴们。 2 遇到的问题 2.1 二维码识别成功率低 使用…

K13021 - 小科坐地铁

题目描述 小科每天上学都是坐地铁的,所以他妈妈给他办了一张地铁卡,每次乘坐地铁出入闸机时刷卡就行。最近一段时间,小科想知道从家到学校要多长时间,所以从地铁公司调出了n次乘车的记录信息进行核算,手动核算太麻烦&…

掌握Go语言中的Channel:并发编程的核心

在Go语言的并发世界里,Channel 是一种至关重要的构建块,它允许不同goroutines之间的数据交换和同步。Channel的独特之处在于它能够以类型安全的方式,优雅地处理数据流和控制流,从而简化了并发编程的复杂性。 什么是Channel 在Go…

Codeforces Round 968 (Div. 2)(A,B,C,D1,D2)

比赛链接 这场还是有点东西的,这几个题都不难,但是要做对还是比较麻烦的。B是一个简单的博弈,C是鸽巢原理,D1是推一个结论,D2是一个dp,初始化比较烦人。 A. Turtle and Good Strings 题面: 乌…

由浅入深学习 C 语言:Hello World【提高篇】

目录 引言 1. Hello World 程序代码 2. C 语言角度分析 Hello World 程序 2.1. 程序功能分析 2.2 指针 2.3 常量指针 2.4 指针常量 3. 反汇编角度分析 Hello World 程序 3.1 栈 3.2 函数用栈传递参数 3.3 函数调用栈 3.4 函数栈帧 3.5 相关寄存器 3.6 相关汇编指令…

一些好用的网站和api合集

title: 集合一些好用的网站和api tags: 笔记收集 文章目录 内容先写这么多吧 以后有再加上去有好用的评论区也可以分享一下网站集合软件集合接口集合ONE金山词霸扇贝单词一言今日诗词Storm 往期内容基础库HAL cubemax VSCODE GCC 内容 这是一个关于一些网站的分享方便自己好…

速盾:深度解析云CDN及应用

云CDN(Content Delivery Network)是一种利用分布式节点服务器提供内容分发服务的技术。它能够将静态和动态的内容分发到离用户最近的服务器节点,从而提高用户访问速度和体验。云CDN在现代互联网应用中扮演着重要的角色,本文将深入…

优化学习管理:Moodle和ONLYOFFICE文档编辑器的完美结合

目录 前言 一、什么是 Moodle 1、简单快速插入表单字段 3、免费表单模板库 4、开启无缝协作 三、在Moodle中集成ONLYOFFICE文档 四、在Moodle安装使用ONLYOFFICE 1、下载安装 2、配置服务器 3、在Moodle中使用ONLYOFFICE 文档活动 五、未来展望 写在最后 前言 在当今教育科技飞…