select* from table的弊端

【修真院java小课堂】为什么不可以用 SELECT * FROM TABLE? 为什么不可以用 SELECT * FROM TABLE? 大家好,我是IT修真院成都分院第13期java学员杨腾东。 今天给大家分享一下关于mysql查询语句SELECT * 的相关知识。 1.背景介绍 MySQL数据库简介: 1、MySQL是一个关系型数据库,关联的数据保存在不同的表中,增加了数据操作的灵活性。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点许多中小型网站... 阅读详情

这里是修真院后端小课堂,每篇分享文从

【select* from table的弊端 】

大家好,我是IT修真院上海分院,一枚正直纯洁善良的如刚入门的Java程序员,今天试着给大家分享一下Select*from table的弊端
sql执行流程机制:

1.客户端发送一条查询给服务器。

2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。

3。服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划

4。MySql根据优化器生成的执行计划,调用存储引擎的API执行查询。

5。返回结果给客户端。

具体用法:

– 检索单个列

SELECT prod_name FROM products;

– 检索多个列

SELECT prod_id, prod_name, prod_price FROM products;

– 检索所有的列

SELECT * FROM products;

– 检索不同的值

select distinct vend_id from products;

– 限制结果 (MYSQL)

SELECT prod_name FROM products;

select prod_name from products limit 5;

select prod_name from products limit 3 offset 0; – 从第0行开始,检索3行

select prod_name from products limit 0, 3; – 从第0行开始,检索3行

问题分析:

1,数据库需要知道等于什么,查数据字典(进行数据库设计的时候,对数据库元素进行的解释说明),这在分析阶段就会增大开销(实际上,ORACLE在解析的过程中, 会将’’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间)。

2,select *最大的问题是可能会多出一些不用的列,这就杜绝了索引覆盖的可能性,导致查询的成本几何级增高(索引覆盖:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。)

3,网络开销,不需要的字段会增加数据传输的时间,在本地客户端连的是本地mysql服务器,TCP协议传输数据会增加额外的时间;数据量越大这种这种劣势就会越明显;如果db和客户端不在同一台机器,比如链接到阿里云,那这种开销就更加明显

4,从另外一个相似的角度来看;就是查询进行的时候,多取了不必要的列,数据字段比较多,mysql并不是把所有结果全部得到后再进行一次性保存,而是每次分配一块大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中mysqI要进行多次内存分配的操作,频繁操作内存都是要耗费时间的。

5,mysql拿到一条命令,会去解析命令、优化查询,然后去存储引擎执行查找,Select*数据库会解析更多的 对象,字段,权限,属性相关,在 SQL 语句复杂,会对数据库造成沉重的负担。选择了实际不会用到的额外的列,就会导致优化和效率问题。

6,原则上讲作为有着良好编程习惯的程序员,也不应该获取自己不需要的东西,若是执行select*,以后表结构修改了,如原表加减了某些列,对代码影响也很大。(源程序就会报错,因为列数不对应。)

7,当然,若是你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 倒是是一个方便的方法,毫无疑问!对于一次性的查询来说,使用Select *没有任何问题,不过要避免将它作为应用开发代码的一部分。程序员可能在代码中编写SQL来选择数据,并放入宿主变量字段。使用Select *时,必须为表中的每一列分别写一个宿主变量。倘若表少了一列,或者表中增加了一个新列呢?如果发生这种情况,就需要调整源代码。为了避免这种可能性,首先就不要使用Select *。

索引拓展:

1,唯一索引怎么判断列唯一:先建立唯一索引, MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。(唯一索引的异常,时由数据库判断,一次 insert 即可,然后程序捕获异常处理)

最好是判断一下,插入之前先看看有没有相同的记录;当然,不做判断直接插入也是可以的,如果没异常,插入成功;如果捕捉到异常,根据异常的类型,判断有重复记录,做出对应业务处理。(去 SqlServer 官方要编号列表呀。然后你的服务器维护这样一个列表,就可以判断哪种因素的原因了)

2,缓存机制的查看

show variables like “%cache”;

show status like “%qcache%”;

参考链接:

http://www.cnblogs.com/xinye/p/3823461.html

https://www.zhihu.com/question/37777220

http://bbs.youkuaiyun.com/topics/390302591?page=1#post-393091122

http://blog.youkuaiyun.com/wujizkm/article/details/50497642

http://blog.youkuaiyun.com/beauty_1991/article/details/51160072

http://blog.youkuaiyun.com/li563868273/article/details/51254907

今天的分享就到这里啦,刚学没多久,水平不够,欢迎大家指正,拍砖~

Ping探测、端口扫描与攻击链:网络入侵检测与防御要点 网络攻击与防范的核心,往往不是某个漏洞利用,而是从协议约定出发的信息收集。ICMP Echo利用无需端口和认证的请求/应答机制判断主机可达性,Ping Sweep可快速筛出存活主机;TCP三次握手与状态机则支撑端口扫描、SYN半开扫描和FIN/XMAS等秘密扫描,通过SYN|ACK、RST或超时差异推断服务开放状态。低成本探测把信息差转化为控制权,也为后续提权、缓冲区溢出利用、驻留与拒绝服务铺路。在渗透测试、内网资产测绘、边界防护和入侵检测中,理解这些原理能帮助建立安全基线、识别隐蔽通道,并用主机日志与流量 阅读详情

相关推荐

告别IIS折腾!用.NET8+Kestrel在Windows上5分钟搞定Web API部署

本文介绍了如何使用.NET8和Kestrel在Windows上快速部署Web API,告别繁琐的IIS配置。通过5分钟实战教程,开发者可以轻松实现高性能、跨平台的API服务部署,显著提升开发效率和系统性能。

weixin_42528780的博客 243

MySQL基础

分页 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录。无疑该查询能够实现分页功能 但是如果m的值越大,查询的性能会越低(越后面的页数,查询性能越低),因为MySQL同样需要扫描过m+n条记录。 方式2: select * from table where id > #max_id# order by id limit n; 该查询每次会返回n条记录,却无需像方式1扫描过m条记录,在大数据量

JavaEdge全是干货的技术号 1758

JavaFx之集成FontAwesomeFX与JFoenix(十五)

本文详细介绍了如何在JavaFx项目中同时集成JFoenix和FontAwesomeFX,以创建现代化、美观的桌面应用界面。通过Maven依赖配置、动态代码创建和FXML静态声明两种方式,演示了如何将JFoenix的Material Design控件与FontAwesomeFX的丰富矢量图标完美结合,并提供了实战案例展示如何构建一个功能完善的现代化工具栏。

pepsi的博客 437

select * from table 和 desc table区别(数据库)

查看出来的内容不一样 select * from table 查看的为一个数据表,所有字段中的内容都显现出来,但是字段属性没有显示。 desc table 是查看的一个表中的字段的属性, 有Type:设置的数据类型,Null:是否可以设置为空值,Key:是否有约束或约束类别,Default:是否设置了默认值,Extra:额外的信息说明。 ...

龙梓琦的博客 3955

CH569 USBSS库函数分析

CH569 USB3.0 解析

havc_W的博客 7683

MATLAB不能识别已安装的visual studio 2015解决方法

首先,对于MATLAB识别已经安装的vs版本通过命令: mex -setup 下图为本电脑下同时安装的两个visual studio 如果搞清楚MATLAB识别电脑上安装vs的过程,可通过命令: mex -setup -v MATLAB输出识别编译器的整个过程。其中HKLM和HKCU分别是注册表中的HKEY_CURRENT_USER,HKEY_LOCAL_MA…的缩写,MATLAB没有找到对应编译器是由于注册表里没有对应信息(主要是文件路径,C++编译器的路径),或者在注册表里存在该信息,但是找不到

qq_36320710的博客 4895

常用SQL语句

索引 create index w on soil_water(ad); -- 添加索引w show index from soil_water; SELECT ad FROM soil_water WHERE ad=8.16 AND ad_base=3.5; ALTER TABLE soil_water DROP index w; -- 删除索引w show keys from so...

JimmyYang的博客 2353

特斯拉数字孪生4.0体系解析:从“数字镜像“到“持续进化“的造车革命

当每一辆汽车都拥有自己的“数字分身”,我们正见证的不仅是技术革新,更是整个制造业文明形态的跃迁。其数字孪生体已超越“数字镜像”的被动属性,成为。特斯拉年服务收入超1200美元/车的业绩表明,数字孪生正在将汽车从“交通工具”转变为“持续增值的智能终端”。构建起覆盖设计、制造、使用、服务全链条的虚拟镜像体系,将物理世界与数字世界的融合推向新高度。:特斯拉的实践证明,数字孪生已从“技术选项”升级为“战略必选项”。不仅重塑了汽车产品的价值创造逻辑,更预示着整个制造业向“元宇宙工业”演进的新范式。

beige888的博客 1607

select * from table的弊端

SQL执行的流程 1.客户端发送一条查询给服务器。 2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。 3.服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划 4.MySql根据优化器生成的执行计划,调用存储引擎的API执行查询。 5.返回结果给客户端。 问题分析 1,首先数据库需要知道*等于什么,查数据字典(进行数据库设计的时候,对数据库元素进行...

葡萄战车的博客 2042

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 266

Python爬虫实战:微信小程序内容采集的全面指南

在移动互联网时代,微信小程序已成为企业和个人提供服务的重要渠道。小程序中包含了大量有价值的信息,但微信官方并未提供便捷的数据获取接口。本文将详细介绍如何使用Python爬虫技术采集微信小程序内容,包括最新技术方案、完整代码实现以及应对各种反爬机制的策略。小程序运行在微信封闭环境中,无法直接访问数据通信主要通过HTTPS加密传输内容动态加载,依赖JavaScript渲染微信有严格的反爬机制。

2201_76125261的博客 3114

为什么不建议用select * ?

不论是自己写还是看公司的祖传代码,是不是都会遇到这种SQL: select * from table; “经验”丰富后,可能你看到了这样的SQL后,大脑中本能的搜索出了网上的各种说使用*不好的文章,但具体是为啥不好呢? 业务表象原因: 1 ,有这样的场景,一个表T被A,B两个功能使用,两个功能查询表T用的都是select *,然后有一天晚上一道闪电从产品经历的眼前闪过,于是产...

进击30K的专栏 4323

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

尽量不要用select into 复制表

select into 复制表会带来灾难后果,因为只是复制了一个外壳,就像克隆人,有躯体没意识,像原表的主键 外键 约束 触发器 索引都不会被复制过来, 创建一个表:CREATE TABLE [dbo].[Users]( [UserId] BIGINT IDENTITY(1, 1) NOT NULL , [UserName] NVARCHAR(25) NUL...

dianyunfan6593的博客 240

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL 查询 select * from table where id in 如何提高效率?

例句:select * from a where id in (select id from b ); 对于这条sql语句它的执行计划其实并不是先查询出b表的所有id,然后再与a表的id进行比较。 mysql会把in子查询转换成exists相关子查询,所以它实际等同于这条sql语句:select * from a where exists(select * from b where b

zoubf的专栏 2万+

慎用create table as select,一定要注意默认值的问题

再做一些数据迁移时候,很多人会使用create table  as select * from table where id=-1的方式来年建立一摸一样的表,但是这样做有个很大的弊端,不能将原表中的default value也一同迁移过来,可以看下面的例子:   第一,新建一个表   -- Create table create table table01 (   i

andybbc的博客 1938

如何阻止SELECT * 语句

转自:http://www.cnblogs.com/woodytu/p/4913166.html 我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句。这个方法有很多弊端: 你从你的表里返回每个列,甚至后期加的列。想下如果你的查询里将来加上了VARCHAR(MAX)会发生什么……对于指定的查询,你不能定义覆盖非聚集索引来克服执行计划里的查找(looku

ujm097的博客 379

[sql server] 如何阻止SELECT * 语句

我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句。这个方法有很多弊端: 你从你的表里返回每个列,甚至后期加的列。想下如果你的查询里将来加上了VARCHAR(MAX)会发生什么…… 对于指定的查询,你不能定义覆盖非聚集索引来克服执行计划里的查找(lookup)运算符,因为你会在额外的索引里重复你的数据…… 现在的问题是你如何阻止SELECT *...

weixin_30256505的博客 159

慎用create table as select,一定要注意默认值的问题---大一临时表方法

摘要: 1、再做一些数据迁移时候,很多人会使用create table  as select * from table where id=-1的方式来年建立一摸一样的表,但是这样做有个很大的弊端,不能将原表中的default value也一同迁移过来。 2、  Using the CREATE TABLE ... AS SELECT ... command: This command will

abc15159939239的专栏 1万+
上一篇: java单元测试
下一篇: Java学到什么程度才能叫精通?
learning__java
博客等级 码龄8年 87粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值