• 性能优化:上移下移业务高效率的实现思路


    对于上移下移业务,比如现在对工作任务进行排序,表设计一般如下:

    create table "task" (
       id varchar
       task_name varchar // 任务名称
       order_num int // 排序值
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    原始实现思路

    • 插入到最后:找出最大的orderNum,然后新增的item的orderNum为maxOderNumber+1
    • 插入到中间:找出要插入的前一个item,然后在排在这个item后的的所有item,将他们的orderNum+1,往后挪,最后在插入新增的item。这样子会导致,要往后挪orderNum数据会很多,效率很慢。
    • 删除:删除item,然后找出排在该item后的所有item,往前挪。这样子会导致,要往前挪orderNum数据会很多,效率很慢。
    • 上移/下移:找到要上移item的orderNum,然后根据orderNum-1找到前一个item,互换orderNum。如果是代码写死根据orderNum-1来找到前一个item,这样子对数据要求很高,oderNumber必须要是连续的,如果出现脏数据排序会失效!

    改良实现思路

    原始实现思路一的最大缺点有2个

    1. 插入到中间,或者删除中间的元素,往后挪和往前挪的数据会非常多,影响效率
    2. 上移下移如果根据orderNum-1或orderNum+1来找前一个或后一个item,这样子对数据的要求会很高,必须要求orderNum是连续+1递增的。
    3. 也是正因为对数据的要求高,所以插入和删除的时候不得不维护其他item的orderNum

    改良实现思路

    • 插入(如插入item的Id,前一个preItem的id)
      第一步:找出前一个item的orderNum,select orderNum where id = preItem.id,没有则默认为0
      第二步:找出前一个item的后一个item的orderNum,select orderNum from task where orderNum > preItem.orderNum order by orderNum asc limit 1
      第三步:新插入item的orderNum = (suffixItem.orderNum - preffixItem.orderNum) / 2,在保留x位小数。具体数据库是用double还是varchar存储,这个笔者还没研究哪个效率比较高。
    • 删除(要删除的itemId)
      直接删除item,不需要挪动任何其他的item
    • 上移/下移(要上移的itemId)
      第一步:找到要上移item的orderNum
      第二步:找出要上移item的前一个item的orderNum,select orderNum from task where orderNum < item.orderNum order by orderNum asc limit 1
      第三步:如果前一个oderNum不存在,则表示当前item在最上了,无法移动
      第四步:否则将这两个item交换orderNum,保存
      第五步:可以在开启一个定时器,定时整理orderNum的值

    总结:改良实现思路的好处是解决了两个问题
    1.通过where order > xxx limit 1来找出前一个或后一个,而不是通过order+1或order-1来找出前一个或后一个,可以降低对数据的要求,不要求order必须是连续递增+1的。
    2.正因为对数据的要求降低了,所以删除和插入不需要维护其他item的orderNum了,所以也就加快删除和插入的效率了!

  • 相关阅读:
    特征缩放是强制性的吗? 什么时候使用标准化? 什么时候使用归一化?数据的分布会发生什么变化?对异常值有什么影响?模型的准确性会提高吗?
    基于Python和mysql开发的智慧校园答题考试系统(源码+数据库+程序配置说明书+程序使用说明书)
    Jetpack架构组件学习(4)——APP Startup库的使用
    Windows Linux 子系统迎来多项改进,并增加IPv6支持
    数据结构:哈希表
    YB2419是一款功能齐备,内置mos100%占空比高效率同步降压IC
    19.声明式事务的事务隔离级别和事务传播行为
    Golang recover
    GaoNeng:我是如何为OpenTiny贡献新组件的?
    在CentOS7系统中安装MySQL5.7
  • 原文地址:https://blog.csdn.net/Yal_insist/article/details/126279936