您的当前位置:首页>全部文章>文章详情

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

发表于:2024-10-21 11:27:23浏览:303次TAG: #mysql

 

前言

因为 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,避免查询结果集过大。

猜你喜欢

【MSQL】MATCH() AGAINST()全文搜索
这个问题是关于MySQL的全文搜索查询。MATCH() AGAINST() 是MySQL全文搜索的一部分。问题中的代码是在查询中使用MATCH() AGAINST(),但是使用方式有一些问题。首先,MATCH() 函数的参数应该是一个字段名,而不是一个字段值。其次,AGAINST 子句后面应该是要搜索的字符串,并且这个字符串需要被单引号包围。在布尔全文搜索模式下,你需要使用一些特殊的操作符来表示搜索的重要性或条件。例如,+表示一个词必须存在,而 - 表示一个词必须不存在。SELECT 
发表于:2024-07-26 浏览:244 TAG:
【MySQL】库操作
第二篇:库操作#一、系统数据库#1.information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列表息、权限信息、字符信息等 2.mysql:核心数据库,里面包含用户、权限、关键字等信息。不可以删除 3.performance_schema:mysql 5.5 版本后添加的新库,主要收集系统性能参数,记录处理查询请求时发生的各种事件、锁等现象 4.sys:mysql5.7 版本新增加的库,通过这个库可
发表于:2024-06-21 浏览:392 TAG: #mysql
【MySQL】表操作
第三篇:表操作#一、什么是表#表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段二、创建表#语法CREATE TABLE 表名( 字段名1  类型[(宽度)约束条件], 字段名1  类型[(宽度)约束条件], 字段名1  类型[(宽度)约束条件] )ENGINE=innodb DEFAULT CHARSET utf8; create
发表于:2024-06-21 浏览:287 TAG: #mysql
【MySql】表的创建与修改
文章目录表:怎么创建和修改数据表?添加字段修改字段1. 如何创建数据表?2. 都有哪些约束?3. 如何修改表?表:怎么创建和修改数据表?创建和修改数据表,是数据存储过程中的重要一环。我们不仅需要把表创建出来,还需要正确的设置限定条件,这样才能确保数据的一致性和完整性。同时,表中的数据会随着业务需求的变化而变化,添加和修改相应的字段也是常见的操作。在一个简单的超市项目中,客户经常需要进货,这就需要在MySQL数据库里面创建一个表,来管理进货的相关数据。假设这个表叫做进货单头表(importhead
发表于:2023-12-08 浏览:429 TAG:
【MySql】深入解析数据库索引
写在前面 MySQL索引是数据库中一个关键的概念,它可以极大地提高查询性能,加快数据检索速度。但是,要充分发挥索引的作用,需要深入理解它们的工作原理和使用方式。在本文中,我们将深入解析MySQL索引,探讨它们的重要性、类型、创建、维护以及最佳实践。一、基础介绍 1.1 什么是索引?在数据库中,索引是一种数据结构,用于快速查找表中的数据。索引包含表中一列或多列的值,这些值按照一定的顺序进行排序,以便优化数据的检索速度。通过使用索引,数据库可以避免全表扫描,从而提高查询
发表于:2023-12-07 浏览:357 TAG:
【MySql】MySql给数据库表添加新字段
要在MySQL中添加新字段,您可以使用ALTER TABLE语句。以下是添加新字段的基本语法:ALTER TABLE table_name ADD column_name datatype;其中:table_name 是您要在其中添加新字段的表的名称。column_name 是新字段的名称。datatype 是新字段的数据类型。例如,VARCHAR、INT或DOUBLE等。以下是一个示例ALTER TABLE语句,演示如何向名为user的表添加一
发表于:2024-09-03 浏览:249 TAG: #mysql
【MySQL】MySQL数据库CPU飙升到100%解决方案
1、定位cpu问题所在当cpu飙升到100%时,先用操作系统命令top命令观察是不是mysqld占用导致的,如果不是,找出占用高的进程,并进行相关处理。2、查看慢查询日志进入mysql命令行mysql -h主机地址 -u用户名 -p用户密码1查看慢查询SQL是否启用:ON是开启,OFF是关闭。 show variables like ‘log_slow_queries’;开启慢查询日志 set global log_slow_queries = on;3、使用sho
发表于:2024-07-17 浏览:256 TAG:
【MySQL】MySQL索引原理与慢查询优化
浏览目录# 一、索引介绍二、索引方法三、索引类型四、聚合索引和辅助索引五、测试索引六、正确使用索引七、组合索引八、注意事项九、查询计划十、慢日志查询十一、大数据量分页优化一、索引介绍#  一般的应用系统,读写的比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出现问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。什么是索引:简单来说,相当于图书的目录,可以帮助用户快速找到需要的内容。   在mysql中
发表于:2024-06-21 浏览:385 TAG:
【MySQL】数据操作
一、数据操作介绍#在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作1.INSERT实现数据的插入2.UPDATE实现数据的更新3.DELETE实现数据的删除4.SELECT查询数据 二、插入数据  #语法一: 按字段进行插入 insert into 表(字段1,字段2 ...) values (值1,值2 ...);   二:按字段顺序插入 insert into&nbs
发表于:2024-06-21 浏览:311 TAG: #mysql
【MySQL】MySql中的锁(表锁,行锁)
    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 概述    相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。My
发表于:2024-06-16 浏览:243 TAG: