设计高效的sql查询语句

设计高效合理的MySQL查询语句讲解 立即下载

数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数据的量积累到一定的程度,比如一个银行的账户数据库表信息积累到上百万甚至上千万条记录,全表扫描一次往往需要数十分钟,甚至数小时。如果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,由此可见查询优化技术的重要性。

笔者在应用项目的实施中发现,许多程序员在利用一些前端数据库开发工具(如PowerBuilder、Delphi等)开发数据库应用程序时,只注重用户界面的华丽,并不重视查询语句的效率问题,导致所开发出来的应用系统效率低下,资源浪费严重。因此,如何设计高效合理的查询语句就显得非常重要。本文以应用实例为基础,结合数据库理论,介绍查询优化技术在现实系统中的运用。

分析问题

许多程序员认为查询优化是DBMS(数据库管理系统)的任务,与程序员所编写的SQL语句关系不大,这是错误的。一个好的查询计划往往可以使程序性能提高数十倍。查询计划是用户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。DBMS处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化之后,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。在实际的数据库产品(如Oracle、Sybase等)的高版本中都是采用基于代价的优化方法,这种优化能根据从系统字典表所得到的信息来估计不同的查询规划的代价,然后选择一个较优的规划。虽然现在的数据库产品在查询优化方面已经做得越来越好,但由用户提交的SQL语句是系统优化的基础,很难设想一个原本糟糕的查询计划经过系统的优化之后会变得高效,因此用户所写语句的优劣至关重要。系统所做查询优化我们暂不讨论,下面重点说明改善用户查询计划的解决方案。

解决问题

下面以关系数据库系统Informix为例,介绍改善用户查询计划的方法。

1.合理使用索引

索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:

●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

2.避免或简化排序

应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

●索引中不包括一个或几个待排序的列;

●group by或order by子句中列的次序与索引的次序不一样;

●排序的列来自不同的表。

为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

3.消除对大型表行数据的顺序存取

在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

  SELECT * FROM orders WHERE customer_num=104 AND order_num>1001

  UNION

  SELECT * FROM orders WHERE order_num=1008

这样就能利用索引路径处理查询。

4.避免相关子查询

一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

5.避免困难的正规表达式

MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”

即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

6.使用临时表加速查询

把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:

  SELECT cust.name,rcVBles.balance,……other columns

  FROM cust,rcvbles

  WHERE cust.customer_id = rcvlbes.customer_id

  AND rcvblls.balance>0

  AND cust.postcode>“98000”

  ORDER BY cust.name

如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:

  SELECT cust.name,rcvbles.balance,……other columns

  FROM cust,rcvbles

  WHERE cust.customer_id = rcvlbes.customer_id

  AND rcvblls.balance>0

  ORDER BY cust.name

  INTO TEMP cust_with_balance

然后以下面的方式在临时表中查询:

  SELECT * FROM cust_with_balance

  WHERE postcode>“98000”

临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

7.用排序来取代非顺序存取

非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。

S7-1200PLC 2轴直线插补详细算法(完整源代码) 速度轴V90PN总线伺服梯形加减速速度控制(标准报文1应用)_v90伺服加减速时间怎么调整-优快云博客文章浏览阅读288次。 阅读详情

相关推荐

基于YOLOv8的多类别检测模型融合实战:从数据集重构到模型训练

本文详细介绍了如何将多个单一类别的YOLOv8检测模型融合为一个高效的多类别检测模型。通过重构数据集、利用预训练模型生成新标签,并重新训练,解决了多模型并行带来的速度慢、资源占用高和部署复杂等问题。实战流程涵盖数据准备、标签生成、模型训练与评估,旨在帮助开发者构建性能优异的YOLOv8多类别检测模型。

kmeans3miner的博客 229

MySQL数据库——高级查询语句

数据库是用来存储数据,更新,查询数据的工具,而查询数据是一个数据库最为核心的功能,数据库是用来承载信息,而信息是用来分析和查看的。例:SELECT A.Store_Name Store, SUM(A.Sales) “Total Sales” FROM fxk003 A GROUP BY A.Store_Name;例:SELECT Store_Name, SUM(Sales) FROM fxk003 GROUP BY Store_Name HAVING SUM(Sales) > 1500;

weixin_67300995的博客 7132

RS485接口EMC设计:三级防护与滤波隔离方案

RS485总线在工业现场面临共模噪声、差模脉冲和地电位差三大电磁兼容挑战。通过三级防护架构(气体放电管、PTC热敏电阻、半导体放电管)实现能量梯次泄放,结合共模扼流圈和滤波电容形成完整防护链。该方案经实测可将6kV浪涌下的通信稳定性提升90%,特别适用于工业自动化、电力监控等严苛环境。设计要点包括防护器件选型计算、PCB分区布局及地处理策略,其中GDT通流能力与TSS箝位电压的配合是关键。

weixin_33419305的博客 526

常用代码模板2——数据结构

算法基础课相关代码模板 活动链接 —— 算法基础课 单链表 —— 模板题 AcWing 826. 单链表 // head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 int head, e[N], ne[N], idx; // 初始化 void init() { head = -1; idx = 0; } // 在链表头插入一个数...

胡胖胖的鱼塘 280

emwin与Modbus通信结合:项目实例

通过实际项目讲解emwin界面设计与Modbus通信协议的融合应用,深入剖析数据交互流程。掌握emwin在工业控制场景中的实用技巧,提升系统人机交互与稳定通信能力。

weixin_34618526的博客 483

华为OD机试 - 字符串筛选排序 - 数组(Python/JS/C/C++ 双机位C卷 100分)

k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果第k个最小ASCII码值的字母存在重复 则输出该字母的最小位置索引。输入一个由N个大小写字母组成的字符串,按照ASCII码值从小到大进行排序,查找字符串中第K个最小ASCII码值的字母(k>=1)。k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果有重复字母则输出字母的最小位置索引。输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引。第二行输入k ,k必须大于0 ,k可以大于输入字符串的长度。

学Java,找哪吒 1392

mysql 高效语句_如何设计高效合理的MySQL查询语句

MySQL查询语句大家都在用,但是应该如何设计高效合理的MySQL查询语句呢?下面就教您MySQL查询语句的合理设计方法,分享给大家学习学习。1.合理使用索引索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化...

weixin_39702335的博客 135

【DRAM存储器五十一】LPDDR5介绍--DFE与Pre-Emphasis

简述LPDDR5的DFE和预加重应用设置

highman110的博客 711

数据结构之查找

一:查找的基本概念 (1)查找表: 由同一类型的数据元素构成的集合 1)静态查找表:只做查找操作的查找表 1)查询某个“特定数据”元素是否在查找表中。 2)检索某个特定的数据元素和各种属性; 2)动态查找表:在查找过程中同事插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。 1)查找时插入元素 2)查找时删除元素 (2)关键字: 数据元素中某个数据项的值。   1)主关键字...

ypshowm的博客 609

风光储并网对电力系统稳定性影响的仿真研究

本文研究了风光储并网对电力系统稳定性的影响,基于MATLAB/Simulink平台搭建了IEEE 9节点测试系统的风光储并网模型。研究对比了光储、风储和风光储三种并网配置在多种干扰下的稳定性表现。结果表明:光储系统对频率变化最敏感,风储系统具有更强的功率波动适应能力,而风光储联合系统通过互补效应展现出最佳综合稳定性。储能系统在所有配置中均显著改善了频率恢复性能,验证了其在新能源并网中的关键支撑作用。研究为高比例可再生能源电力系统的稳定运行提供了仿真依据和技术参考。

huanghm88的专栏 156

Motoman机器人离线编程——Motocom32开发简介

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章: Motoman机器人离线编程——Motocom32开发简介 Motoman机器人离线编程——Visio Studio环境配置 Motoman机器人离线编程——Motocom32库函数的使用与封装 Motoman机器人离线编程——Motocom32参考文献及注意事项 Motoman机器人离线编程——MotocomES介绍 ...

冯Jungle的个人博客 8714

mysql中优化类型不等于2的sql语句_如何设计高效合理的MySQl查询语句?23种常用类型汇总...

MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。那什么是MySQL,你真的了解吗?1、什么是数据库 ?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库随着...

weixin_31108739的博客 359

TensorRT - 使用自定义层扩展 TensorRT

TensorRT 支持通过自定义插件扩展功能。开发者可以基于 IPluginV3 接口实现插件类,并通过 IPluginCreatorV3One 创建器类注册到 TensorRT 插件注册表。插件实现需要包含核心、构建和运行时三种能力,并通过静态或动态方式注册。最后可使用 addPluginV3() 将插件实例添加到 TensorRT 网络中。这种方法允许在标准层不满足需求时,使用自定义层扩展模型功能。

1149

SQL 查询语句汇总

在软件开发和数据分析中,SQL(结构化查询语言)是与数据库交互的重要工具。为了更好地理解 SQL 查询语句的使用,本文将设计一个简单的数据库,包括几张表,并通过这些表展示各种 SQL 查询的应用。

码上飞扬的博客 1101

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

一条SQL查询语句是如何执行的

一条 SQL 查询语句的执行是一个复杂的过程,涉及数据库管理系统的多个核心组件协同工作。以 MySQL(使用 InnoDB 存储引擎)为例,其核心流程大致可分为以下几个阶段:核心步骤分解:连接管理 (连接器)解析与验证 (解析器)查询优化 (优化器)执行阶段 (执行器 + 存储引擎)结果返回关键点总结:一个简单的 SELECT 例子: 连接器验证你的连接权限。 解析器检查语法,生成解析树。 优化器看到 : 发现 列有主键索引(或唯一索引)。 决定使用该索引进行快速查找(成本最低)。 生成计划:。

走过冬季 948

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从入门到精通掌握SQL核心查询语句与高效优化技巧

适当的索引设计是优化查询速度的关键,但需注意索引并非越多越好。掌握数据库提供的性能监控工具,如MySQL的Slow Query Log、PostgreSQL的pg_stat_statements。子查询可分为相关子查询和非相关子查询,前者依赖于外部查询的结果,后者可独立执行。虽然占用存储空间,但对于频繁执行的复杂查询,物化视图可以交易存储空间换取查询时间的大幅减少。定期进行查询重构,随着数据量和访问模式的变化,原本高效的查询可能变得低效。定期分析索引使用情况,删除未使用的索引,确保索引统计信息的最新性。

zhangjingleimail的博客 364

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

影响SQL Server性能的关键三个方面

1 逻辑数据库和表的设计 数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序打下良好的基础。 标准化的数据库逻辑设计包括用多的、有相互关系的窄表来代替很多列的长数据表。下面是一些使用标准化表的一些好处。 A:由于表窄,因此可以使排序和建立索引更为迅速。 B:由于多表,所以多镞的索引成为可能。C:更窄更紧凑的索引。 D:每个表中可以有

leagle 921

SQL查询的艺术掌握数据库高效操作的关键

然而,索引并非越多越好,因为索引本身也需要占用存储空间,并且在数据插入、更新和删除时需要维护,会带来额外的开销。通过分析执行计划,开发者可以清晰地了解数据库是如何执行一条SQL语句的:是否使用了索引、表的连接顺序、是否有昂贵的操作如全表扫描或排序等。对于大量数据的操作,应将多个操作捆绑成批处理任务,而不是执行大量的小事务,这样可以显著减少网络往返和事务日志的开销。同时,合理控制事务的范围,保持事务尽可能短小,及时提交事务以释放锁定的资源,可以提高系统的并发处理能力和整体性能。

yangcme的博客 408

[SQL优化技巧]

谨慎使用子查询,尤其在WHERE子句中使用IN或EXISTS时,需评估其与JOIN操作的性能差异,通常JOIN的效率更高。合理的索引设计是提升查询性能的关键。应在经常用于查询条件的列、连接操作的列以及排序和分组的列上创建索引。避免在重复值过多或频繁更新的列上建立索引,因为维护索引的开销可能会超过其带来的性能收益。定期分析索引的使用情况,并使用复合索引来覆盖多个查询条件,但需注意索引列的顺序,将选择性高的列放在前面。对于复杂且耗时的查询结果,可以考虑将结果预先计算并存储,避免实时计算的性能消耗。

qq_37779781的博客 282

SQL优化在高效数据处理中的关键策略

同时,应定期监控索引的使用情况,删除冗余和未使用的索引,因为过多索引会影响写操作的性能。同时,建立持续的性能监控机制,跟踪慢查询日志,识别频繁执行的低效查询。使用数据库提供的性能监控工具,定期检查系统资源使用情况,如CPU、内存和I/O负载,确保硬件资源不会成为性能瓶颈。遵循适当的规范化原则,减少数据冗余,确保数据一致性。然而,在某些查询频繁的场景下,适度的反规范化可以显著提升性能,如添加冗余字段避免多表关联。同时,选择合适的数据类型也很重要,较小的数据类型不仅节省存储空间,还能加快查询速度。

agfca的博客 404

SQL优化大全:详细总结30个超级实用的SQL优化技巧

在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文详细总结了30个实用的SQL优化技巧,并附带示例代码,帮助各位大大构建高效、稳定的数据库应用。

勤于笔记,成于点滴。 1万+

sql语句优化

在说到sql语句优化的时候,必须考虑咱们为啥要优化它,优化它给咱们能带来啥好处,是不是.那咱们现在就先说说为啥要优化它啦   1.SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定性的作用。   2.SQL语句消耗了70%至90%的数据库资源。   3.SQL语句独立于程序设计逻辑,对SQL语句进行优化不会影响程序逻辑。   4.SQL语句有不同的写法,在性能上的差异非常大。  ...

xiaoshengjinbu的博客 92

[SQL秘籍]高效查询优化技巧大揭秘

对于字符串类型,考虑使用VARCHAR而非CHAR,除非长度固定。规范化表结构以减少数据冗余,但在需要极致查询性能的场景下,适度的反范式设计(如冗余字段)可以减少JOIN操作,也是一种有效的优化策略。在分页查询中,避免使用OFFSET过大,可采用基于游标的分页(如WHERE id > last_id LIMIT n)来提升性能,尤其在大数据量下优势明显。通过解读执行计划,可以识别出全表扫描、临时表使用、文件排序等高成本操作,并据此进行调整,例如添加缺失索引或重写查询逻辑,以引导数据库选择最优的执行路径。

fengchaolee的专栏 318

你了解的sql性能调优方式或者工具都有哪些?

SQL 性能调优是一个综合性的过程,涉及数据库设计、查询优化、索引使用、数据库配置和硬件资源等多个方面。通过合理使用索引、优化查询语句、设计高效的数据表结构、调整数据库配置和使用性能分析工具,可以显著提升数据库的性能。根据具体的业务需求和系统环境,选择合适的优化方法和工具,持续进行性能监控和调优,是确保数据库高效运行的关键。

喜欢猪猪 1479

高效SQL查询优化技巧提升数据库性能的关键策略

同时需要注意避免过度索引,因为索引会增加写入操作的开销,并占用额外的存储空间。定期分析索引使用情况,删除未使用或重复的索引也是保持数据库性能的重要措施。通过合理的表结构设计,减少数据冗余的同时保证查询效率。同时,使用数据库提供的性能监控工具,跟踪慢查询并针对性地进行优化。对于查询频繁但更新不频繁的数据,使用缓存可以避免重复执行相同查询。采用多级缓存策略,包括数据库查询缓存、应用级缓存和分布式缓存,根据数据特性选择合适的缓存失效策略。同时,需要注意缓存一致性问题的处理,确保数据的准确性和时效性。

Hboxod的博客 373

掌握SQL关键词TAG提升数据库查询效率的核心技巧

MySQL的EXPLAIN、SQL Server的执行计划分析、Oracle的SQL Trace等工具可以帮助开发者理解查询执行过程。应避免使用SELECT ,而是明确指定需要的列,减少不必要的数据传输。索引是提升数据库查询效率最直接有效的方法之一,它通过为数据表特定列创建有序的数据结构,从而减少数据库需要扫描的数据量。避免在频繁更新的列上创建过多索引,因为索引的维护会带来额外的写入开销。良好的数据库设计是高效查询的基础。使用分区表将大表物理分割成更小的、更易管理的部分,可以显著提升大数据的查询效率。

chang_quanyou的博客 213
上一篇: Google Reader API
下一篇: 字符,字节和编码
zhsp1029
博客等级 码龄21年 115粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值