你还在 select * 吗?

COLMAP生成MVSNet数据集 阅读详情
点上方“菜鸟学Python”,选择“星标”
共460篇原创干货,第一时间送达

作者:AIOps

应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。

那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系。

程序中嵌入的一行行的SQL语句,如果使用了一些优化小技巧,定能达到事半功倍的效果。

技巧1  比较运算符能用 “=”就不用“<>”

“=”增加了索引的使用几率。

技巧2  明知只有一条查询结果,那请使用 “LIMIT 1”

“LIMIT 1”可以避免全表扫描,找到对应结果就不会再继续扫描了。

技巧3  为列选择合适的数据类型

能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,道理你懂的,磁盘和内存消耗越小越好嘛。

技巧4  将大的DELETE,UPDATE or INSERT 查询变成多个小查询

能写一个几十行、几百行的SQL语句是不是显得逼格很高?然而,为了达到更好的性能以及更好的数据控制,你可以将他们变成多个小查询。

技巧5  使用UNION ALL 代替 UNION,如果结果集允许重复的话

因为 UNION ALL 不去重,效率高于 UNION。

技巧6  为获得相同结果集的多次执行,请保持SQL语句前后一致

这样做的目的是为了充分利用查询缓冲。

比如根据地域和产品id查询产品价格,第一次使用了:

那么第二次同样的查询,请保持以上语句的一致性,比如不要将where语句里面的id和region位置调换顺序。

技巧7  尽量避免使用 “SELECT *”

如果不查询表中所有的列,尽量避免使用 SELECT *,因为它会进行全表扫描,不能有效利用索引,增大了数据库服务器的负担,以及它与应用程序客户端之间的网络IO开销。

技巧8  WHERE 子句里面的列尽量被索引

只是“尽量”哦,并不是说所有的列。因地制宜,根据实际情况进行调整,因为有时索引太多也会降低性能。

技巧9  JOIN 子句里面的列尽量被索引

同样只是“尽量”哦,并不是说所有的列。

技巧10  ORDER BY 的列尽量被索引

ORDER BY的列如果被索引,性能也会更好。

技巧11  使用 LIMIT 实现分页逻辑

不仅提高了性能,同时减少了不必要的数据库和应用间的网络传输。

技巧12  使用 EXPLAIN 关键字去查看执行计划

EXPLAIN 可以检查索引使用情况以及扫描的行。

其他

SQL调优方法有很多种,同样的查询结果可以有很多种不同的查询方式。其实最好的方法就是在开发环境中用最贴近真实的数据集和硬件环境进行测试,然后再发布到生产环境中。

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

年度爆款文案

点阅读原文,领廖雪峰大数据视频资料!
中国工商银行企业架构建设实践最全总结 中国工商银行参考IBM持续价值创新方法并吸收TOGAF等主流企业架构的框架理念,结合业务实际情况形成工行自己的企业架构方法论并实践,为数字化转型提供支撑。本案例通过介绍中国工商银行企业架构之业务架构设计方法,为其他银行企业架构建设提供参考。 企业架构是数字化转型的抓手,可以帮助企业规划、管理和实施数字化解决方案,以实现业务目标并适应不断变化的市场条件。中国工商银行通过战略目标指导业务架构的规划和设计,业务架构建模后指导IT架构建模。 阅读详情

相关推荐

如何更好的理解PFC(功率因数校正)

此电路虽然简单,可以在前期设计的无PFC功能的设备上,简单的增加一个合适的电感(适当的选取L和C的值),从而达到具有PFC的作用,但是这种简单的、低成本的无源PFC输出纹波较大,滤波电容两端的直流电压也较低,电流畸变的校正及功率因数补偿的能力都很差,而且L的绕制及铁芯的质量控制不好,会对图像及伴音产生严重的干扰,只能是对于前期无PFC设备使之能进入市场的临时措施。)在t4~t5期间尽管二极管左边电压在逐步上升,但是由于二极管右边的Uc放电缓慢右边的电压Uc仍旧大于左边,二极管仍旧反偏截止。

U_YAO的博客 948

union以指定的条件去重

with temp as( select a,b,c from t1 union all select a,b,c from t2 ) select a,b,c from (select a,b,c,row_number() over (partition by a order by b,c) rn from temp) where rn=1 ; 根据a列去重

sunlang的博客 9519

PHP特性知识点总结

(1)类型转换之前提到过的是字符串转为整型。其实php手册里面提到了各种类型的转换。先把他放在这里。我们按照php手册上的顺序来介绍,只介绍几个比较常用的。①转化为bool②转化为整型int。

m0_73605862的博客 1295

delete select语句_你还在 select * 吗?

(给数据分析与开发加星标,提升数据技能)作者:AIOps应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系。程序中嵌入的一行行的SQL语句,如果使用了一些优化小技巧,定能达到事半功倍的效果。技巧1 比较运算符能用 “=”就不用...

weixin_39927059的博客 250

cdh zookeeper未授权访问(安全漏洞)处理

前言: 最近公司在做安全漏洞扫描。发现cdh zookeeper存在未授权访问的问题。 ZooKeeper的节点有5种操作权限: CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写) 注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限 ZooKeeper的身份的认证有4种方式: world:默认方式,相当于全世界都能访问 auth:代表已经认证通过的..

belialxing的专栏 2446

机器视觉:9点标定的原理与实现

标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素,如下图所示,10mm的距离内有222个像素,那像素坐标和实际的毫米坐标就有个比例关系了。

m0_49968063的博客 1万+

mysql在查询时如何使用的多线程提高查询速度

MySQL可以通过以下方式利用多线程来提高查询速度:并发查询:MySQL支持多个查询同时执行,每个查询使用不同的线程。这可以通过在不同的连接上执行多个查询来实现。并行查询:MySQL可以将单个查询拆分为多个部分,并将这些部分并行执行。这可以通过启用查询优化器的并行执行功能来实现。并行复制:MySQL支持将复制操作拆分为多个线程执行,以提高复制速度。这可以通过启用复制线程池功能来实现。并行索引创建:MySQL支持在创建索引时使用多个线程,以加快索引创建速度。

小金的优快云博客 2516

如何设计提示词来减少 AI 的幻觉问题?

如何设计提示词来减少 AI 的幻觉问题?

我哎GIS博客 2468

你还在 Select * 吗?

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达作者:AIOps来源:AIOps应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。那么...

程序员闪充宝 264

提升JVM性能:CMS垃圾回收器的优化分析与案例研究

本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记,分析了可能导致性能瓶颈的因素如停顿时间过长和内存碎片化。文章还分享了调整垃圾回收参数、结合其他垃圾回收器以及内存优化等方法,帮助提高CMS的回收效率和性能。最后,文章展望了随着JVM发展,结合新一代垃圾回收器优化的趋势,助力Java应用在高并发环境下的性能提升。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

FreeRTOS深入教程(任务创建的深入和任务调度机制分析)

本篇文章将带大家深入学习任务的创建和分析任务调度的机制。本篇文章深入的讲解了任务创建的内部实现和任务调度的源代码分析和实现,学习这篇文章有助于更深入的学习FreeRTOS的源码。

m0_49476241的博客 6391

联合主键---去重复记录的方法

方法1、 就是将三个字段连接起来作为主键,进行数据是否重复的判断。这里值得注意的是某列的值可能为空,所以要赋一个空字符串过去: select * from t1 where nvl(col1,'')|| nvl(col2,'')|| col3 not in (select col1||col2||col3 from t2) 方法2、 统计多表联合查询 去重复记录的方法 两表...

Jsky 760

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

select * 和 select 所有字段的区别

程序员的成长之路互联网/程序员/成长/职场关注阅读本文大概需要 1 分钟。之前发过的文章中,关于 select * 和 select 所有字段的知识,有描述不恰当,这次...

良月柒 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

为什么大家都说SELECT * 效率低

无论在工作还是面试中,关于SQL中不要用“SELECT *”,都是大家听烂了的问题,虽说听烂了,但普遍理解还是在很浅的层面,并没有多少人去追根究底,探究其原理。 废话不多说,本文带你深入了解一下"SELECT * "效率低的原因及场景。 本文很干!请自备茶水,没时间看记得先收藏 -- 来自一位被技术经理毒打多年的程序员的忠告

陈哈哈的菜园子 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

select * 和select 所有字段_select * 和 select 所有字段的区别

阅读本文大概需要 1 分钟。之前发过的文章中,关于 select * 和 select 所有字段的知识,有描述不恰当,这次重新纠正下,加深下理解。MySQL 5.1.37表记录数 41,547,002,即 4000+w 行。使用远程客户端取 1000 条数据,统计时间:SELECT * FROM dmsp.dmsp_dimension_content LIMIT 0, 1000;时间 2.218s...

weixin_36013428的博客 735

在CentOS 7.5内网服务器上,我是如何搞定PostgreSQL 14和PostGIS 3.2离线部署的(附完整依赖包清单)

本文详细介绍了在CentOS 7.5内网服务器上实现PostgreSQL 14和PostGIS 3.2离线部署的完整方案。通过构建本地仓库、智能依赖管理及分阶段安装策略,解决了187个间接依赖问题,并提供生产环境配置优化建议,适用于金融、军工等高安全要求场景。

weixin_30402343的博客 495

为什么总是说不能用select *呢

相信很多开发小伙伴在入行以后,都会听到项目经理或开发组长强调:sql脚本中避免使用select *哈 。 曾经我也一样,当经理说起sql中尽量不要使用select * 的时候,内心不以为然,直到有一天被现实打脸真正吃了亏。虽然也知道不让用的几个大概原因,但依然是我行我素。看看手里的项目,心想,毕竟前辈们敲的代码里也不乏有select *的存在,不是到现在也运行的好好的,也没出现什么问题嘛。 自己去问百度为什么不能用的时候,通常是就是那么几点: 1. select * 属于全表扫描,不利于提高查询效率。

nangong5566的博客 4772

select *和select 字段名

建议使用select 字段名 而少用select *。原因如下 1、SELECT*语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。 2、如果表的结构在以后发生了改变,那么SELECT*语句可能会取到不正确的数据甚至是出错。 3、执行SELECT*语句时,SQLServer首先要查找出表中有哪些列,然后才能开始执行SELECT*语句,这在某些情况会产生性能问题。 4、使用SELECT*语句将不会使用到...

渣渣 1万+

MySQL的SELECT * = SELECT 1?

维度SELECT *SELECT 1语义获取全量数据仅验证存在性I/O可能多次页读取(含溢出页)最小页读取(常仅索引)网络开销高极低适用场景真实需要所有字段存在性判断、心跳检测✅结论:SELECT *≠SELECT 1。它们解决的是完全不同层次的问题——一个是“拿数据”,一个是“问有没有”。

长风破浪会有时的博客 622

select * 和select 所有字段的区别

MySQL 5.1.37 表记录数41,547,002,即4000w行 使用远程客户端取1000条数据,统计时间: SELECT * FROM dmsp.dmsp_dimension_content LIMIT 0, 1000; 时间2.218s,网络消耗0.547s SELECT id, appid, aop, t, uid, sid, pid, pname, bid, bname, ptype, sm, sv, bt, national, area, ov FROMdmsp.dmsp_dimension

qq_34486648的博客 1857

别用select *

1. 不需要的列会增加数据传输时间和网络开销 用“SELECT * ”数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。 增大网络开销;* 有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。如果DB和应用程序不在同一台机器,这种开销非常明显 即使 mysql 服务器和客户端是在同一台机器上,使用的协议还是 tcp,通信也是需要额外的时间。 2. 对于无用的大字段,如 varchar、blob、

Meiko记录 321

SELECT * 真相

转自 http://www.cnblogs.com/goodspeed/archive/2007/07/20/index_coverage.html SELECT *的效率很糟糕吗?当然,所有人都知道这一点,但是为什么呢?是因为返回了太多的数据?这是一个普遍的回答,但我不这样认为。如果你的数据库设计规范合理,那么带宽占用实际上非常的小。让我们看看下面的例子。下面的查询将会从

oicqhf的专栏 1414

Oracle中select 1和select *的区别

转: Oracle中select 1和select *的区别 转自:https://www.linuxidc.com/Linux/2010-05/26202.htm 创建myt表并插入数据,如下: create table myt(name varchar2,create_time date) insert into myt values('john',to_d...

weixin_30487201的博客 991
上一篇: 我,北漂5年程序员,终于在帝都全款买房
下一篇: 龟叔都推荐!Python3.10再更新版本,全新的七大特点
菜鸟学Python
博客等级 码龄9年 8044粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值