当前位置: 首页 > 图灵资讯 > 技术篇> 一文讲解如何写出高效精致SQL

一文讲解如何写出高效精致SQL

来源:图灵教育
时间:2023-07-09 16:55:21

尽量避免selectttselectttel * from,返回所需的字段

在日常查询表数据中,经常不自觉地写select * from,查询所有字段信息;虽然记录较少的单表没有感觉,但当多个表相关且表量较大时,select * from将返回所有表的字段,这将影响查询效率。更好的方法是检查你需要什么,只返回所需的字段信息;这也符合开发中至少知道的原则,尽量不要暴露不必要的信息。

避免全量查询,控制查询粒度尽可能小

在日常开发环境查询中,可以随意写select * from tableA,这种查询将返回所有记录和字段。如果这种查询误升级到生产环境,查询太慢可能会带来灾难性的后果。全表扫描是一种低效的查询方法,应尽量避免。通过使用索引、适当的过滤条件和JOIN优化,减少全表面扫描。因此,在查询过程中,习惯性地增加where条件过滤(如分页、字段过滤、日期间隔等),并返回尽可能小的数据,这将大大提高查询效率。

查询时尽量索引,最好提前设计索引

当单表记录过多,通过非索引字段进行表相关查询时,查询效率很低;此时,建立相关字段的索引将大大提高查询效率。因此,在设计表格时,最好考虑业务场景,建立索引通常用于过滤查询或表相关字段,这将对后续查询有很大的好处。同时,在查询过程中,也尝试采用索引查询,远高于非索引查询效率。

尽量避免索引失效的场景

虽然索引很好,但是如果使用不当,可能无法达到预期的效果,这就需要重点关注索引失效的情况,并尽量避免。

索引失效的场景主要包括:

联合索引不符合最左匹配的原则

使用select * 查询

使用索引列进行表达式操作

索引列使用内置函数

使用like模糊查询错误

索引列的类型隐藏转换

使用or操作

使用>,<,!=等待索引列的比较

使用is not null

使用not in和not exixts

错误的order by 排序

避免在Update上完全修改,只修改所需的字段

修改表记录时,updateByIdid是一些随意操作(Entity entity),虽然也可以成功更新,但是注意sql会发现他把Entity拿走了。 所有的字段都更新了,我们可能只是想修改一个状态字段。后者只修改少量字段的效率明显高于全修改。更重要的是,它可以避免误修改其他字段,导致其他一些问题。

尽量用数值代替字符串类型

节省存储空间:数值通常比字符串类型占用更少的存储空间。在大规模数据集中,使用数值类型可以显著降低数据库的存储需求,从而提高系统的性能和效率。

提高查询性能:在数据库查询中,比较值类型通常比字符串类型更快。因为数值类型可以直接比较,而字符串类型需要逐个比较

仔细选择“硬删除”的重要数据

删除数据很酷,但也很有风险,尤其是重要数据被误删除。删除数据通常包括物理删除(硬删除)、逻辑删除。但是,无论删除什么样的删除,都要注意有限的条件,不要删除所有的数据,也不要逃跑。

物理删除可以节省内存空间,同时确保表中只有有效的数据,具有良好的可读性。但如果物理删除,数据很可能不会恢复。逻辑删除,虽然更安全,但一定程度的污染表数据,每次相关查询,都必须记住过滤有效的数据。

对于一些有价值的历史数据,是否可以考虑设计历史表来存储被删除的历史数据,一方面可以保证可追溯性,但也可以保证原始表数据的简洁性和有效性。