首页 > 其他分享 >排序

排序

时间:2023-09-15 16:35:31浏览次数:27  
标签:语句 city name limit 100 排序

  • 问题
假设你的表里面已经有了 city_name(city, name) 这个联合索引,然后你要查杭州和苏州两个城市中所有的市民的姓名,并且按名字排序,显示前 100 条记录。如果 SQL 查询语句是这么写的 :

mysql> select * from t where city in ('杭州'," 苏州 ") order by name limit 100;
那么,这个语句执行的时候会有排序过程吗,为什么?
如果业务端代码由你来开发,需要实现一个在数据库端不需要排序的方案,你会怎么实现呢?
进一步地,如果有分页需求,要显示第 101 页,也就是说语句最后要改成 “limit 10000,100”, 你的实现方法又会是什么呢?
  • 分析
虽然有 (city,name) 联合索引,对于单个 city 内部,name 是递增的。但是由于这条 SQL 语句不是要单独地查一个 city 的值,而是同时查了"杭州"和" 苏州 "两个城市,因此所有满足条件的 name 就不是递增的了。也就是说,这条 SQL 语句需要排序。

那怎么避免排序呢?

这里,我们要用到 (city,name) 联合索引的特性,把这一条语句拆成两条语句,执行流程如下:

执行 select * from t where city=“杭州” order by name limit 100; 这个语句是不需要排序的,客户端用一个长度为 100 的内存数组 A 保存结果。

执行 select * from t where city=“苏州” order by name limit 100; 用相同的方法,假设结果被存进了内存数组 B。

现在 A 和 B 是两个有序数组,然后你可以用归并排序的思想,得到 name 最小的前 100 值,就是我们需要的结果了。

如果把这条 SQL 语句里“limit 100”改成“limit 10000,100”的话,处理方式其实也差不多,即:要把上面的两条语句改成写:

select * from t where city=" 杭州 " order by name limit 10100; 
和
select * from t where city=" 苏州 " order by name limit 10100。
这时候数据量较大,可以同时起两个连接一行行读结果,用归并排序算法拿到这两个结果集里,按顺序取第 10001~10100 的 name 值,就是需要的结果了。

当然这个方案有一个明显的损失,就是从数据库返回给客户端的数据量变大了。

所以,如果数据的单行比较大的话,可以考虑把这两条 SQL 语句改成下面这种写法:

select id,name from t where city=" 杭州 " order by name limit 10100; 
和
select id,name from t where city=" 苏州 " order by name limit 10100。
然后,再用归并排序的方法取得按 name 顺序第 10001~10100 的 name、id 的值,然后拿着这 100 个 id 到数据库中去查出所有记录。

上面这些方法,需要你根据性能需求和开发的复杂度做出权衡。
  • 参考答案
这条 SQL 语句需要排序

标签:语句,city,name,limit,100,排序
From: https://blog.51cto.com/u_16082754/7483326

相关文章

  • 2023.9.14 整数二分排序
    1#二分23##整数二分45~~~c++6//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用7inttest01(intl,intr)8{9while(l<r)10{11intmid=(l+r)/2;12boolcheck(intmid);//check判断mid是否满足x性质13if(check(......
  • 深入了解归并排序算法
    归并排序(MergeSort)是一种高效的、基于分治法的排序算法,它的稳定性和性能使其成为常用的排序方法之一。本文将详细介绍归并排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。归并排序的基本思想归并排序的核心思想是将数组分成两个子数组,递归地对这两个子数组进行排......
  • EndNote调整中文、英文参考文献的排序顺序
      本文介绍在EndNote软件中,使得参考文献按照语种排列,中文在前、英文在后的方法。  前期我们在文献管理EndNote软件自定义修改引文输出格式的方法一文中,详细介绍了文献管理软件EndNote的引用格式自定义方法,其中我们设置了将参考文献部分的文章按照文章语种进行排序,而这一设置在......
  • vu3 列表拖动排序
    <el-tableclass="flex-table"size="medium":border="true"tooltip-effect="dark"highlight-current-row:data="branchTableData"......
  • vue3 elementplus 列表中添加排序功能,移动的时候修改背景色
    <el-tablesize="medium":border="true":data="branchTableData":row-style="changeColor":stripe=falsestyle="width:100%;">......
  • List<Map>根据属性排序
    第二种排序法:倒叙:list.sort((o1,o2)->o2.get("UTILIZSIZE").toString().compareTo(o1.get("UTILIZSIZE").toString()));正序:list.sort((o1,o2)->o1.get("UTILIZSIZE").toString().compareTo(o2.get("UTILIZSIZE").toString(......
  • 算法回顾之一:冒泡排序
    数据结构与算法是计算机本科相关专业学生的必修课,我当年自然也是学过的,而且印象考试成绩还不错。不过近期写了一个冒泡排序算法(不使用类库实现),竟然出现了Bug,实在惭愧。仔细想想工作这几年一直都是使用Java集合框架和类库,因此感觉还是有必要再重温一下。-------------------------......
  • 算法回顾之二:直接插入排序
    算法回顾系列第二篇:直接插入排序算法-------------------------------------------直接插入排序基本原理:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含一个元素,无序表中包含有n-1个元素。排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当......
  • es 排序 聚合统计
    (27条消息)es排序聚合统计_吐血整理:一文看懂ES的R,查询与聚合_weixin_39901439的博客-CSDN博客模糊匹配select*fromcompanywherenamelike'%康康%'GETred/_search{"query":{"match":{"companyname":"康康"}}}上述查询会查......
  • C++ 实现 快速排序
    #include<iostream>usingnamespacestd;voidquickSort(int(&)[10],int,int);intpartition(int(&)[10],int,int);voidprintArr(constint(&)[10]);voidswap(int(&)[10],int,int);intmain(){ intarr[10]={23,45,18,6,11,19,22,......