【数据库原理】(23)实际应用中的查询优化方法

一.基于索引的优化

索引是数据库查询优化的关键工具之一。合理地使用索引可以显著提高查询速度,降低全表扫描的成本。以下是建立和使用索引的一些基本原则和最佳实践。

索引的建立与使用原则

  1. 数据量规模与查询频率: 值得建立索引的表通常具有较多的记录,且查询主要集中在少数记录上。小规模的表不适宜建立索引。

  2. 索引的使用频率: 应在经常在WHERE子句中使用的列上建立索引。不要盲目增加索引,因为每次数据更新时,所有索引都需要维护,这会影响系统效率。

  3. 数据装入与索引建立顺序: 在表中装入初始数据后再建立索引,可提高数据导入速度。

  4. 排序与分组操作: 经常需要排序或分组的列,如使用GROUP BYORDER BY的列,应考虑建立索引,特别是涉及多个列的复合索引。

  5. 选择性与聚簇索引: 在选择性高且重复值少的列上建立索引效果较好。有大量范围查询时,可考虑建立聚簇索引。

  6. 索引的选择性: 如果查询经常返回少于表总行数20%的数据,则建立索引可能带来性能提升。超过这个比例,全表扫描可能更高效。

  7. 查询覆盖与索引维护: 如果查询可以通过索引来完全覆盖,即查询列都包含在索引中,则查询优化器可以直接从索引中获取结果,避免访问表数据。

  8. 索引与主键: 如果对主键的查询较少,不应该在主键上建立聚簇索引。应根据实际情况,考虑将聚簇索引分配给经常使用范围查询的列。

  9. 索引的宽度: 索引越窄,其效率越高,因为每个数据页可以存储更多的索引项,索引的深度也较浅。

  10. 避免在包含大量NULL值的列上建立索引: 包含许多NULL值的列不适宜建立索引,因为它们通常不会参与查询条件。

索引的测试与调整

像代码和数据库结构一样,索引在投入生产前需要经过精细的测试和调整。索引策略并没有固定不变的规则,需要深入理解表的关系、查询和事务需求,以及数据本身的特性,以便有效地使用索引。过多的索引不仅无助于提升性能,反而会占用额外的磁盘空间并降低更新操作的效率。

注意事项

  • 表和索引应该事先规划好。
  • 使用索引并不总是能解决所有性能问题,有时候它们可能不会提供预期的性能提升,甚至可能降低性能。
  • 有效的SQL语句编写是索引优化的前提。不当的SQL语句使用可能使得索引失效。

二.查询语句的优化

优化查询语句是提高数据库查询效率的关键。虽然查询优化器已经帮助用户实现了很多优化,但理解和运用以下优化技巧可以进一步提升查询效率。

1. 避免和简化排序
  • 尽量减少或避免对大型表的重复排序操作。
  • 利用索引自动产生所需排序顺序,从而避免执行显式的排序操作。
2. 消除大型表的顺序存储
  • 对于嵌套查询,使用索引或并集(UNION)来代替顺序存取。
  • 尽量避免在 WHERE 子句中使用 OR 运算符,因为它们通常导致全表扫描。
-- 示例2:优化 OR 运算
SELECT * FROM employees 
WHERE department = 'Sales' OR department = 'IT'-- 改进为
SELECT * FROM employees WHERE department = 'Sales'
UNION
SELECT * FROM employees WHERE department = 'IT'
3. 避免相关子查询
  • 替代相关子查询以提高效率。相关子查询通常对性能有负面影响,特别是在主查询的列值变化时。
4. 避免复杂的正则表达式
  • 避免使用复杂的模式匹配,特别是使用 LIKE 运算符,因为它们通常耗时更多。
5. 使用临时表加速查询
  • 对表的子集排序并创建临时表,可以加速查询过程。临时表在处理特定查询时更高效。
6. 使用排序替代非顺序存储
  • 利用数据库排序而不是非顺序磁盘存取,以减少磁盘 I/O 操作。
7. 避免大规模排序操作
  • 在不影响用户体验的情况下,将排序操作安排在数据库的低峰时段执行。
8. 避免使用 IN 语句
  • 尽可能使用 EXISTS 代替 IN,因为 EXISTS 通常比 IN 更高效。
-- 使用 EXISTS 代替 IN 
SELECT * FROM table1 WHERE column1 IN (SELECT column2 FROM table2)
-- 改进为 
SELECT * FROM table1 t1 WHERE EXISTS (SELECT 1 FROM table2 t2 WHERE t1.column1 = t2.column2)
9. 使用 WHERE 而非 HAVING
  • 尽量在 WHERE 子句中进行筛选,而非在 HAVING 子句中,以避免不必要的行处理。
-- 示例3:避免使用 HAVING 来筛选
SELECT employeeID, COUNT(*) FROM sales
GROUP BY employeeID
HAVING COUNT(*) > 5-- 改进为
SELECT employeeID FROM sales
GROUP BY employeeID
WHERE COUNT(*) > 5
10. 避免使用不兼容的数据类型
  • 避免在查询中混用不兼容的数据类型,以提高查询优化器的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux防火墙查看状态firewall、iptable

1、iptables防火墙 查看防火墙状态 service iptables status 停止防火墙 service iptables stop 启动防火墙 service iptables start 重启防火墙 service iptables restart 永久关闭防火墙 chkconfig iptables off 永久关闭后重启 chkconfig iptables on 开启80端…

【天龙怀旧服】攻略day5

关键字: 天鉴扫荡、举贤、燕子水路 1】85天鉴任务可以扫荡 在流派选择npc那里,花费40交子即可扫荡100点,可以兑换10个灵武打造图; 此外打造图绑定不影响做出来的灵武绑定,只要对应的玉不绑灵武就不绑定 2】冠绝师门…

报错java.lang.IllegalArgumentException: MALFORMED

java.lang.IllegalArgumentException: MALFORMEDat java.util.zip.ZipCoder.toString(ZipCoder.java:58)at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:300)at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122)我是在解压压缩包文件的时候…

想要简化重复订单吗?不妨考虑一揽子采购订单

企业想提高采购流程效率,简化大批量采购是一个很好的开始。财务、会计和采购部门通过系统化订购大量物品(如纸张、打印机墨水和墨粉、清洁用品、纸制品和其他易重复采购的消耗品)可以节省时间和金钱。借助正确的采购订单(PO&#…

android 重启

RescueParty 重启 Android之RescueParty机制 - 简书 01-10 16:39:15.421637 1268 1395 W RescueParty: Attempting rescue level RESET_SETTINGS_UNTRUSTED_DEFAULTS Line 90467: 01-10 16:39:15.422713 1268 1395 W RescueParty: Performing scoped reset for pack…

小程序基础学习(组件通信)

介绍 点击子组件的按钮,把点击事件发送给页面 例如:点击这个“最大的一头猪”,由组件内部设置点击事件然后在传递给页面。 实现原理 给组件内部需要点击的文本设置点击事件 在组件内部监听点击事件,并发送给页面点击事件的详细信…

一天一个设计模式---桥接模式

概念 桥接器模式是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们可以独立变化而不相互影响。桥接器模式通过创建一个桥接接口,连接抽象和实现,从而使两者可以独立演化。 具体内容 桥接器模式通常包括以下几个要素&a…

操作符之可选链和空值合并

可选链操作符 ?. 是 JavaScript 的 ECMAScript 2020 (ES11) 中引入的一项新特性。它的作用是在处理可能为 null 或 undefined 的对象属性或方法时,防止因为访问链中的某个属性或方法为 null 或 undefined 而导致的错误。可选链操作符的语法是 ?.。 让我们来看一个…

node运行 js报错 SyntaxError: Cannot use import statement outside a module

使用babel相关模块来进行转义支持,通过使用babel编译,使其转化为node.js的模块。 1、安装依赖 npm install --save babel-corenpm install --save babel-preset-env npm install babel-cli -g2、在根目录下创建 .babelrc文件。内容为: {&qu…

C# 学习笔记-001-继承

1,继承类型 继承的类型:实现继承和接口继承 实现继承: 表示一个类型派生于一个基类型,拥有改类型的所有成员字段和函数。 接口继承: 表示一个类型只继承了函数函数签名,没有继承任何实现代码。 2&#xff…

电调相关英文缩写ESC、BEC、PPM、Oneshot125、Oneshot42、Multishot、DShot、ProShot

ESC ESC全称是 Electronic Speed Control 中文翻译成电子调速器,就是电调 BEC BEC全称是 battey elimination circuit 中文翻译成免电池电路 可以理解就是对外供电,BEC就是线性稳压,降压用的,给接收机飞控供电 ESC协议 ESC协议…

Android14之解决Pixel手机联网出现感叹号(一百八十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

图解JVM (及一些垃圾回收\GC相关面试题 持续更新)

垃圾回收,顾名思义就是释放垃圾占用的空间,从而提升程序性能,防止内存泄露。当一个对象不再被需要时,该对象就需要被回收并释放空间。 Java 内存运行时数据区域包括程序计数器、虚拟机栈、本地方法栈、堆等区域。其中,…

牛客网BC93 公务员面试

描述: 公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。 输入描述: 每一行,输入7个整数&…

微信使用wx.getLocation

1,小程序管理后台 -「开发」-「开发管理」-「接口设置」” 中完成权限申请; 2,需在 app.json 中声明其需调用的地理位置相关接口 "permission": {"scope.userLocation": { "desc": "你的位置信息将用于小…

03-编码篇-x264编译与介绍

使用FFMPEG作编码操作时,会涉及到将yuv数据编码成h264数据,FFmpeg的libavcodec中的libx264.c会调用x264库的源码作编码: 1.x264库编译 下载X264,地址为:http://www.videolan.org/developers/x264.html,并解…

《2024 年 Web3.0 数字资产趋势报告》(三)

撰文:方军、周芳鸽、李祺虹、张睿彬,Uweb 编辑:Nona,Techub News 点击关注公众号获取完整报告 接下来我们将继续和大家分享《2024 年 Web3.0 数字资产趋势报告》中其余部分。

C语言基础内容(七)——第07章_结构体与共同体

文章目录 第07章_结构体与共用体本章专题脉络1、结构体(struct)类型的基本使用1.1 为什么需要结构体?1.2 结构体的理解1.3 声明结构体1.4 声明结构体变量并调用成员1.5 举例1.6 小 结2、进一步认识结构体2.1 结构体嵌套2.2 结构体占用空间2.3 结构体变量的赋值操作3、结构体数…

requestAnimationFrame实现动画

实现浏览器在每一帧中&#xff0c;将页面div元素的宽度变长1px&#xff0c;直到宽度达到100px后停止。 我们采用requestAnimationFrame来实现这个功能&#xff0c;关键代码如下&#xff1a; <div id"div" className{"progress-bar "} style{{ backgrou…

Python——python练习题

1.小明身高1.75&#xff0c;体重80.5kg。请根据BMI公式&#xff08;体重除以身高的平方&#xff09;帮小明计算他的BMI指数&#xff0c;并根据BMI指数&#xff1a; 低于18.5&#xff1a;过轻 18.5-25&#xff1a;正常 25-28&#xff1a;过重 28-32&#xff1a;肥胖 高于32&…