Mysql 温故知新系列「普通查询 | 排序」

300 阅读2分钟

「这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战

简单查询

查询的模版: select * from table_name,这里的 * 指查询出指定表的全部字段,我们可以将 * 替换为我们具体需要查询的某些字段

需要注意的一个点,在日常的开发中,sql 中非常不建议使用 *,理由有 2 :

  1. 若表进行了字段扩充的话,在 mapper 层需要增加对应的字段映射,哪怕是那个 sql 中确实没有使用到
  2. * 查询出的字段顺序,是以表中字段创建的排序为准,若字段调整,亦或插入了非表尾的地方插入了新字段,这都会影响到 mapper 的映射
  3. 一个更加实际的问题,使用 * 查询全部会拖慢 sql 的执行速度,同时,由于 mybaits 对多余的字段做了映射,此项操作也会存在性能的损耗

口说无凭,以我手里现有的数据为例:

image.png

image.png

有 23 个字段,且总记录数为 37000

先执行数次 select * 操作

image.png

查询大概需要 0.29s

image.png

以我们查询必要的几个字段示例,4 个字段,耗时大概为 0.1s,性能对比起来确实会有很大的改进

排序

在我们常规的表设计中,使用表自增主键+系统时间,查询出来的数据默认使用插入的顺序,看起来就像是 id 升序排列,以及创建时间升序排列

image.png

这种排序方式通常情况下都能用。但是,当用户关注 sparator_line 这一列时,数据就显得杂乱无章,这时候,就需要我们手动指定排序的字段以及方式

排序语句; order by column [asc] 。排序有两种,一种是的升序 asc,不显示指定则默认为此;另一种则是需要显示指定的降序 desc

image.png

有时会有多字段排序的需求,比如在按 字段1 升序排列的结果上,对 字段1 中值相同的数据,按照 字段2 降序排列。如果还需要根据 字段3 进行排序,则在上一步排序的基础上,对 字段2 相同值的数据再排列。多个排序条件之间,使用 , 分隔

以此份数据为例,先按 sparator_line 升序,再按 time 降序

image.png