SELECT * 会导致查询效率低的原因

news/2024/7/9 23:12:04 标签: sql, mysql, postgresql, nosql, 数据库, 数据库开发, select

SELECT * 会导致查询效率低的原因

  • 前言
  • 一、适合SELECT * 的使用场景
  • 二、SELECT * 会导致查询效率低的原因
    • 2.1、数据库引擎的查询流程
    • 2.2、SELECT * 的实际执行过程
    • 2.3、使用 SELECT * 查询语句带来的不良影响
  • 三、优化查询效率的方法
  • 四、总结

前言

因为 SELECT * 查询语句会查询所有的列和行数据,包括不需要的和重复的列,因此它会占用更多的系统资源,导致查询效率低下。而且,由于传输的数据量大,也会增加网络传输的负担,降低系统性能。

如果需要查询所有的列数据,可以使用 LIMIT 关键字限制查询的行数,避免传输过多的数据。在实际开发中建议指定列名,避免使用 SELECT * 。

一、适合SELECT * 的使用场景

SELECT * 是 SQL 语句中的一种,用于查询数据表中所有的列和行。它的使用场景有以下几种:

  • 初学者的练习:当学习 SQL 语言的初学者没有掌握如何选择特定的列时,可以用 SELECT * 来查看完整的数据表结构,这有助于更好地理解数据表的组成。
  • 快捷查询:当需要查询数据表中所有的数据时,SELECT * 可以快捷地查找到所有的数据,省去了手动输入列名的麻烦。
  • 在某些情况下,使用 SELECT * 可以使 SQL 语句更加简洁明了,让代码更易于维护和修改。

但SELECT *也有一些潜在的风险,比如 SELECT * 可能会导致查询效率低下、数据冗余和安全问题等。

二、SELECT * 会导致查询效率低的原因

2.1、数据库引擎的查询流程

数据库引擎的查询流程通常包含以下几个步骤:

  1. 解析 SQL 语句:数据库引擎先将 SQL 语句解析成内部的执行计划,包括了查询哪些数据表、使用哪些索引、如何连接多个数据表等信息。
  2. 优化查询计划:数据库引擎对内部的执行计划进行优化,根据查询的复杂度、数据量和系统资源等因素,选择最优的执行计划。
  3. 执行查询计划:数据库引擎根据执行计划,通过 I/O 操作读取数据表的数据,进行数据过滤、排序、分组等操作,最终返回结果集。
  4. 缓存查询结果:如果查询结果集比较大或者查询频率较高,数据库引擎会将查询结果缓存在内存中,以加速后续的查询操作。

以MySQL为例:

执行一条select语句时,会经过:

  1. 连接器:主要作用是建立连接、管理连接及校验用户信息。
  2. 查询缓冲:查询缓冲是以key-value的方式存储,key就是查询语句,value就是查询语句的查询结果集;如果命中直接返回。注意,MySQL 8.0已经删除了查询缓冲。
  3. 分析器:词法句法分析生成语法树。
  4. 优化器:指定执行计划,选择查询成本最小的计划。
  5. 执行器:根据执行计划,从存储引擎获取数据,并返回客户端。

在这里插入图片描述

2.2、SELECT * 的实际执行过程

当使用 SELECT * 查询语句时,数据库引擎会将所有的列都查询出来,包括不需要的和重复的列,然后将这些数据传输到客户端。这个过程会涉及以下几个步骤:

  1. 执行解析 SQL 语句:当数据库引擎接收到 SELECT * 查询语句时,会首先解析该语句,确定需要查询哪些数据表,以及如何连接这些数据表,然后将解析结果保存到内部的执行计划中。
  2. 执行查询计划:根据执行计划,数据库引擎会扫描相应的数据表,读取所有的列和行数据,然后将这些数据传输到客户端。
  3. 数据传输到客户端:一旦查询完成,数据库引擎将查询结果集发送到客户端,包括所有的列和行数据。

由于 SELECT * 查询语句会查询所有的列和行数据,包括不需要的和重复的列,因此它会占用更多的系统资源,导致查询效率低下。而且,由于传输的数据量大,也会增加网络传输的负担,降低系统性能。

2.3、使用 SELECT * 查询语句带来的不良影响

  1. 查询效率低下:由于 SELECT * 查询语句会查询所有列和行数据,包括不需要的和重复的列,因此会占用更多的系统资源,导致查询效率低下。
  2. 数据冗余:使用 SELECT * 查询语句可能会查询出不必要的重复数据,增加数据库的存储空间,降低数据库的性能。
  3. 网络传输负担增加:由于 SELECT * 查询语句会传输所有的列和行数据,因此会增加网络传输的负担,降低系统性能。
  4. 安全问题:如果数据表中包含敏感信息,使用 SELECT * 查询语句可能会泄露敏感信息,引发安全问题。

所以,建议选择具体的列进行查询。如果需要查询所有的列数据,可以使用 LIMIT 关键字限制查询的行数,避免传输过多的数据。

三、优化查询效率的方法

(1)SELECT 显式指定字段名。SELECT 显式指定字段名的优势:

  • 减少不必要的数据传输 。

  • 减少内存消耗。

  • 提高查询效率

  • SELECT 显式指定字段名的注意事项: 掌握数据表结构、避免指定过多的字段 、避免频繁修改查询语句。

(2)使用索引。

(3)减少子查询。

(4)避免使用 OR 操作符。

四、总结

SELECT * 的不良影响:

  • 查询效率低下;
  • 数据冗余;
  • 网络传输负担增加;
  • 安全问题。

显式指定字段名的优势:

  • 查询效率更高;
  • 减少数据冗余;
  • 网络传输负担减少;
  • 更好的代码可读性;
  • 提高安全性。

优化查询效率的方法:

  • 显式指定需要查询的字段名;
  • 使用 LIMIT 关键字限制查询的行数;
  • 优化索引,提高查询效率;
  • 避免在 WHERE 子句中使用函数或表达式,以免影响查询效率;
  • 避免使用子查询,以免引起性能问题;
  • 合理使用 JOIN,避免查询结果集过大。

在这里插入图片描述


http://www.niftyadmin.cn/n/1008664.html

相关文章

JavaSE学习总结(五)

聊一聊你对泛型的理解 泛型就是将类型参数化,在编译时才确定具体的参数,泛型可以用于类、接口和方法,即泛型类、泛型接口和泛型方法。使用泛型主要有两个好处,第一是提高Java程序的类型安全,这也是泛型的主要目的&…

Ai绘画-Midjourney常用关键词

一、视角关键词 视角关键词近距离景Tight Shot两人/物景Two Shot (2S), Three Shot (3S), Group Shot (GS)三人/物景Three Shot (3S), Group Shot (GS)风景照Scenery Shot背景虚化Bokeh前景Foreground背景Background细节镜头Detail Shot (ECU)面部拍摄Face Shot (VCU)膝景Knee …

HOT31-K个一组翻转链表

leetcode原题链接:K个一组翻转链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余…

Radzen Blazor Studio 1.12 Crack

Radzen Blazor Studio 是一款桌面工具,使 开发人员 能够创建精美的商业 Blazor 应用程序。快速地。 开放技术栈 没有供应商锁定。生成的源代码是人类可读的,您可以使用免费工具构建它。 Radzen 由流行的开源技术 - ASP.NET Core、Blazor、Bootstrap 提供…

基于大数据技术对基金分析-python

提示:本文为个人原创,仅供技术探讨与交流,对实际投资并不造成建议。 基于大数据技术对基金分析-python 前言一、数据获取:python爬虫1).从天天基金数据接口获取数据2).爬虫前期准备3).爬虫具体实现 二、数据清洗及计算指标1.过滤数…

gpt4写Python“gc”模块文档,答使用del后变量是否被回收,Python3“gc”模块与Micropython里“gc”模块对比

gpt4: gc模块文档 Python的gc模块提供了一个接口给开发者直接访问Python的垃圾收集器。这个模块主要用来处理Python的循环引用问题,例如,当两个对象互相引用对方,但其他任何对象都不再引用它们时,它们就会形成一个循…

【洛谷】B3643 图的存储(邻接矩阵+邻接表)

思路简单&#xff0c;话不多说直接上ACcode(详细注释): ACcode:(安全饲用)&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N1e310; int mp[N][N],n,m; vector<int>v[N]; void fun1(){//邻接矩阵打印 for(int i1;i<…

第九十三天学习记录:C++核心:类和对象Ⅱ(五星重要)

对象的初始化和清理 构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始化状态&#xff0c;对其使用后果是未知 同样的使用完一个对象或变量&#xff0c;没有及时清理&#xff0c;也会造成一定的安全问题 c利用了构造函数和析构函数…