mysql中使用select的正确姿势你知道吗?

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 引言大家在开发中,还有很多童鞋在写查询语句的时候,习惯写下面这种不规范sql而不写成下面的这种规范方式 我也知道,这些童鞋是图方便,毕竟再敲一堆的列名,嫌麻烦!你们上班可以问问自己的同事 我也知道,很多人至今都没有搞懂select *和selct 所有字段的区别因此,我开一文来说明一下。

引言

大家在开发中,还有很多童鞋在写查询语句的时候,习惯写下面这种不规范sql

而不写成下面的这种规范方式

 

我也知道,这些童鞋是图方便,毕竟再敲一堆的列名,嫌麻烦!

你们上班可以问问自己的同事

 

我也知道,很多人至今都没有搞懂select *和selct 所有字段的区别

因此,我开一文来说明一下。另外,我选的是自己最熟悉的mysql数据库,此文的结论在oralce,sqlserver上是否成立,博主没做过测试。

正文

(select所有字段)性能高?

网络上流传着一种说法说是

 

然而,实际上呢?效率是相差不大的!。

取博客

http://flysnowxf.iteye.com/blog/1125032

的测试结果

mysql 5.1.37 

表记录数41,547,002,即4000w行 

使用远程客户端取1000条数据,统计时间:

 

时间2.218s,网络消耗0.547s

 

取出所有字段,时间2.250s,网络消耗0.578s 

可以看出,这二者的时间差几乎可以忽略,另外还有一本书上的内容也可以佐证我的话。

《SQL CookBook》第一章 检索记录中1.1小节(原书第十五页内容如下):

此书也说明了,两种方式在性能上几乎是没有差距的。

那为什么还是不推荐select * ?

网络IO问题

很多文章里说什么,会带来额外的内存、磁盘、cpu的开销。对此,我有自己的观点。我觉得这不是主要原因。主要原因是带来了额外的网络开销。

在一个系统中,内存、磁盘、cpu的开销,不过是微秒级。造成系统的延迟的重头戏是网络开销。网络开销可能带来秒级的延迟。当然,如果你的应用程序和数据库是在同一台机器上的,那当我没说这句话!

select *会查询出不需要的、额外的数据,那么这些额外的数据在网络上进行传输,必定会造成性能延迟。假设你的table中,有一个列的类型为binary。此时,你的select *操作,就会十分缓慢,并且会造成额外的网络开销。

索引问题

仔细看下面的两句sql

 

如果col1字段包含索引信息,那么此时,这两句的sql执行时间可能会有几十上百倍的差异。

在col1字段有索引的情况下,mysql是可以不用读data,直接使用index里面的值就返回结果的。但是一旦用了select *,就会有其他列需要读取,这时在读完index以后还需要去读data才会返回结果。这样就造成了额外的性能开销。

ps:我不想在这里扯什么覆盖索引,辅助索引的概念。其实要讲的很专业,扯一堆高大上的名词,我也可以。只是这样徒增读者的理解难度,尽量用通俗的方式来讲。

扩展性问题

有的人会觉得

 

然而实际上,你的sql是不用改了,但是对你的程序代码是有很大的影响的!

身为一名21世纪的优良程序员,我们是不能获取自己需要的东西的!你因为一时高兴,执行了select *,如果增加或删除列,会对你的代码有着极大的影响。

反过来,如果你select 指定列,只获取自己需要的几列,表结构的修改,对你代码的影响就会小很多。相比之下,风险就没有那么大了!

另外就是,对于其他人接手你项目的人来说,看到select 指定列的方式,可读性更强,对于他们来说更好上手!

欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 关系型数据库 MySQL
在云数据仓库AnalyticDB MySQL版中,有几个参数可能影响SELECT查询的执行及其稳定性
在云数据仓库AnalyticDB MySQL版中,有几个参数可能影响SELECT查询的执行及其稳定性【1月更文挑战第16天】【1月更文挑战第80篇】
526 4
|
关系型数据库 MySQL
【MySQL】——Select查询语句知识点练习(其一)
【MySQL】——Select查询语句知识点练习(其一)
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
470 0
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表10、数据导入和导出——1、数据导入(LOAD DATA, mysqldump)——2、数据导出(SELECT ... INTO OUTFILE, mysqldump)
MySQL技能完整学习列表10、数据导入和导出——1、数据导入(LOAD DATA, mysqldump)——2、数据导出(SELECT ... INTO OUTFILE, mysqldump)
408 0
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
存储 关系型数据库 MySQL
在 MySQL 中使用 Insert Into Select
【8月更文挑战第11天】
7769 0
在 MySQL 中使用 Insert Into Select
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
241 2
|
关系型数据库 MySQL Linux
mysql 将select结果导出文件 linux
mysql 将select结果导出文件 linux
259 3
|
存储 SQL 关系型数据库
【MySQL进阶之路 | 基础篇】基本的SELECT语句及DESC显示表结构
【MySQL进阶之路 | 基础篇】基本的SELECT语句及DESC显示表结构
|
关系型数据库 MySQL 索引
MySQL之优化SELECT语句
以上只是一些基本的优化策略,具体的优化方案还需要根据实际的业务需求和数据情况来定制。
245 0