SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段

简介: SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段

1.查询时的普遍写法

select *
from the_table_name
where ...

2.问题分析

2.1 计算负担

数据库需要去解析更多的对象字段、权限、属性,查询数据字典将"*"按序转换成所有列名。那么在SQL语句复杂,硬解析比较多的情况下,会给数据库增加计算负担。

2.2 IO负担

星号意味着查询所有的字段,我们都知道MySQL数据库的数据都是存储在磁盘上的,那么将全部字段数据从磁盘读取到内存的磁盘IO开销比较大,特别是某些字段占的存储空间还比较大时,比如说 text,blob 这种类型的字段,压力会更大。同时应用服务器(Java端)从数据库服务器通过网络传输获取数据的开销也会比较大,占用更多网络带宽,造成网络延迟。

2.3 覆盖索引失效

select * 会失去覆盖索引的可能性,回表操作造成了索引效率发挥不出来。

简单解释下为什么覆盖索引失效:

比如 t_user 表中有 id,name,age 三个字段,我们在 id 上建立了主键索引,在 name 上建立了普通索引,那么就存在了两棵B+树,此时我们只需要 如果我们只需要根据 name 查询到 id 和 name 两个字段的信息。

如果使用 select * 的写法:

select * from t_user
where name = ?

那么首先会从磁盘中将 name 建立的辅助索引读取到内存,查到了符合的 name 后,由于select * 因此还要查询 age ,就会根据符合的 name 进行一次或多次回表操作。

但如果使用的是明确指明字段的方式:

select `id`,name from t_user
where name = ?

那么从辅助索引中查到了符合的 name 后,就不需要回表操作去查询无用的age,而 id 身为主键自然在辅助索引中保存了与 name 对应的信息。

2.4 缓存压力

如果需要将某些热点数据进行缓存(比如在redis中缓存),如果不在缓存时做更多剔除不必要字段信息的处理,那么对查询到的所有字段数据进行缓存到内存中,会导致内存也消耗更快。

3.总结

在阿里巴巴的规范中,有两点要求:

  1. 严禁使用 select * 进行查询
  2. 尽可能返回少的字段,即不要查询用不到的字段

对于这两个规范,包括上述提到的问题分析,其实对于我们大多数人的实际开发中会发现对性能的影响不会很大,甚至是可以忽略不计,我认为有两点原因:

  • 大多数人不会在阿里巴巴之类的大厂,也就没有特别大的用户量,并发低、数据库存储压力小,自然对服务器性能影响不会很大,也不必在乎select * 带来的这一点小的影响。
  • 即使是查询全部字段,也不会占很大IO开销,因为对于大的类型字段,我们通常会选择垂直分表操作,把这些大的字段信息单独放到其他表中存储。

因此,相比于阿里巴巴的严禁使用,在这里想说的是:

在表查询中,建议明确字段,不要使用 * 作为查询的字段列表,推荐使用SELECT <字段列表> 查询,并且不去查询用不到的字段。

但我们还是需要知道为什么阿里巴巴有这样的规范,即上述的问题分析,因为真实面试可能会问到,同时呢,在有DBA的公司中也通常会要求开发工程师不要去使用 select *。😫


相关文章
|
20小时前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
27 20
|
20天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
64 9
|
1月前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
150 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
26天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
65 11
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
43 8
|
2月前
|
SQL 缓存 数据库
SQL慢查询优化策略
在数据库管理和应用开发中,SQL查询的性能优化至关重要。慢查询优化不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将详细介绍针对SQL慢查询的优化策略。
|
2月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
2月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
SQL 关系型数据库
SQL更新部分字段或者插入新数据
SQL更新部分字段或者插入新数据http://www.bieryun.com/3184.html 因为业务的原因,一张表的数据需要整合两张外键关联不强的表数据,这里涉及到更新部分字段或者插入新数据。
1588 0
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")