当前位置: 首页 > news >正文

数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)

10.6.  数据库开发常识

作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋下性能和稳定性方面的隐患。可遗憾的是,现实中,很大一部分的专业开发人员只能做到保量的完成工作任务,而做不到既保量也保质。这也就不难解释,现实中,为什么很多应用系统上线后,性能和稳定性等方面还频繁的出现问题。

这里所谓的数据库开发常识,指经过长期不断的基础理论和实践经验的积累与沉淀,专业人员获得的数据库开发方面的规律和结论,用以帮助提高数据库开发工作的效率,更重要的是保证开发成果的质量。

下面仅就实际工作中最常遇到的,也是最常用到的数据库开发常识进行介绍和说明,以期对各位有所启发和帮助。

10.6.1. 判断SQL性能的标准

目前几乎所有高版本关系库(RDB,Relational Database)的优化器都是CBO(见本专栏6.1节)的,那么,判断一条SQL语句性能好坏的标准只有一个,那就是执行计划(Explain Plan)及其成本。拿到一条SQL语句的执行计划前,我们没办法准确判断其性能的好坏及问题所在。因此,我们不但要掌握获取执行计划的方法,也要学会查看和分析执行计划,起码要会查看和分析简单的执行计划。

10.6.2. 索引相关误区

1)走索引一定是最优的。

查看和分析执行计划时,有一个大家似乎公认的调优原则,那就是:走FTS就一定是错的,存在性能问题的;走index就一定是对的,是最优的。针对这种观点,我只能说:不一定,要看具体的实际情况。大家先考虑下为什么这么说?为了便于理解,我们考虑两个比较极端的场景。

  • 第一个场景,假设表里的数据比较少,一个数据块就能容纳,并且,表的相应列上有B*Tree索引,假设索引也只有一个数据块。我们哪怕只访问表里的一条数据时,当不走索引时,我们只需读取一个数据块就可以,那就是表的所有数据块;如果走索引,那么,就得读取两个数据块,先读索引块,然后,读表的数据块,大家比较下,哪个成本高哪个成本低呢?
  • 另一个场景,假设一个表有100个数据块,索引有20个数据块。当我们读取表里90%的数据时,如果不走索引,那么,只需要读取表的100个数据块;而如果走索引,就得读取至少18+90=108个数据块。这么看,走索引似乎有点得不偿失,大家比较下,该场景下,哪个成本高哪个成本低呢?
  • 当然,以上只是通过这两个极端、理想的场景说明一个道理:走index未必最优,走FTS也未必就有问题。现实中,场景和成本计算都要比这里复杂得多,也还会涉及到其他概念和因素,例如:FTS的并行多块读,index的顺序读,索引的聚簇因子(Cluster Factor)等,这些都会影响SQL语句的最终执行计划。

--注:

      1)大家思考下,当读取相同的数据块数时,并行多块读和顺序读的区别和结果分别是什么?

      2)这里大家需要思考一个问题,那就是在现实工作中,有时查询一张表所读取的数据块数比整张表的数据块数还要多,有时是整张表数据块数的几倍甚至几十倍,为什么?

2)索引可随便创建

现实工作中,很多公司或机构的开发库、测试库甚至生产库的管理和权限控制,既很不严格,也非常不规范。所有或部分员工都可以随便访问数据库,且都拥有修改数据、建立、删除索引及其他对象,甚至数据库的最高权限。现实中,由于员工随便删除索引导致事故的案例并不稀奇,因员工随便乱建索引而引发数据库负载居高不下、性能陡降,甚至引起严重事故的现象也是屡见不鲜。

因此,规范数据库管理和严控数据库权限,尤其是机构生产库的管理和权限,会很大程度上避免事故的发生和减少由此带来的损失。由此,也杜绝了无序的乱建索引而引发的一系列问题和后果。现实工作中,除非确定索引能极大的改善某个应用模块或操作的性能,且不会对其他应用模块或操作带来负面影响,否则,还是三思而后行,最好通过规范的流程和渠道去分析、确定和实施索引策略。

--注:

      1)大家思考下,删除索引为什么会导致事故?随便建索引又为什么会导致负载居高不下、性能陡降,甚至引起事故?

相关文章:

数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)

10.6. 数据库开发常识 作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋…...

网络爬虫js逆向之某音乐平台案例

【注意!!!】 前言: - 本章主要讲解某音乐平台的js逆向知识 - 使用关键字搜定位加密入口 - 通过多篇文章【文字案例】的形式系统化进行描述 - 本文章全文进行了脱敏处理 - 详细代码不进行展示,需要则私聊作者 爬虫js逆向…...

Spark--算子执行原理

一、sortByKey SortByKey是一个transformation算子,但是会触发action,因为在sortByKey方法内部,会对每个分区进行采样,构建分区规则(RangePartitioner)。 内部执行流程 1、创建RangePartitioner part&…...

事件驱动架构(EDA)

事件驱动架构(Event-Driven Architecture, EDA)是一种软件架构模式,其中系统的行为由事件的产生和处理驱动。在这种架构中,系统的组件通过事件进行交互,而不是通过直接的调用或者请求响应方式。 关键概念 事件&#x…...

C++ 入门速通-第5章【黑马】

内容来源于:黑马 集成开发环境:CLion 先前学习完了C第1章的内容: C 入门速通-第1章【黑马】-CSDN博客 C 入门速通-第2章【黑马】-CSDN博客 C 入门速通-第3章【黑马】-CSDN博客 C 入门速通-第4章【黑马】-CSDN博客 下面继续学习第5章&…...

2025春招,深度思考MyBatis面试题

大家好,我是V哥,2025年的春招马上就是到来,正在准备求职的朋友过完年,也该收收心,好好思考一下自己哪些技术点还需要补一补了,今天 V 哥要跟大家聊的是MyBatis框架的问题,站在一个高级程序员的角…...

排序算法--冒泡排序

冒泡排序虽然简单&#xff0c;但在实际应用中效率较低&#xff0c;适合小规模数据或教学演示。 // 冒泡排序函数 void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) { // 外层循环控制排序轮数for (int j 0; j < n - i - 1; j) { // 内层循环控制每轮比…...

简易C语言矩阵运算库

参考网址&#xff1a; 异想家纯C语言矩阵运算库 - Sandeepin - 博客园 这次比opencv快⑥倍&#xff01;&#xff01;&#xff01; 参考上述网址&#xff0c;整理了一下代码&#xff1a; //main.c#include <stdio.h> #include <stdlib.h> #include <string.h…...

通过C/C++编程语言实现“数据结构”课程中的链表

引言 链表(Linked List)是数据结构中最基础且最重要的线性存储结构之一。与数组的连续内存分配不同,链表通过指针将分散的内存块串联起来,具有动态扩展和高效插入/删除的特性。本文将以C/C++语言为例,从底层原理到代码实现,手把手教你构建完整的链表结构,并深入探讨其应…...

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面&#xff1a;简化调用复杂性2. 系统层面&#xff1a;屏蔽客户端调用差异3. 其他方面&#xff1a; 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1&#xff1a;同步阻塞处理2. Zuul2&#xff1a;异步非阻塞处理 三…...

基于Kamailio、MySQL、Redis、Gin、Vue.js的微服务架构

每个服务使用一台独立的服务器的可行部署方案&#xff0c;尤其是在高并发、高可用性要求较高的场景中。这种方案通常被称为分布式部署或微服务架构。以下是针对您的VoIP管理系统&#xff08;基于Kamailio、MySQL、Redis、Gin、Vue.js&#xff09;的详细分析和建议。 1. 分布式部…...

6S模型的编译问题解决

使用python处理遥感光谱数据&#xff0c;免不了进行大气校正&#xff0c;基本上免费的就是使用Py6s&#xff0c;而py6s库只是一个接口&#xff0c;还需要自己配置6S模型&#xff0c;可以查到很多资料&#xff0c;6S模型是古老的fortran语言写的&#xff0c;基本配置流程就是安装…...

C++11详解(二) -- 引用折叠和完美转发

文章目录 2. 右值引用和移动语义2.6 类型分类&#xff08;实践中没什么用&#xff09;2.7 引用折叠2.8 完美转发2.9 引用折叠和完美转发的实例 2. 右值引用和移动语义 2.6 类型分类&#xff08;实践中没什么用&#xff09; C11以后&#xff0c;进一步对类型进行了划分&#x…...

实验十四 EL和JSTL

实验十四 EL和JSTL 一、实验目的 1、掌握EL表达式的使用 2、掌握JSTL的使用 二、实验过程 1、在数据库Book中建立表Tbook&#xff0c;包含图书ID&#xff0c;图书名称&#xff0c;图书价格。实现在bookQuery.jsp页面中模糊查询图书&#xff0c;如果图书的价格在50元以上&#…...

为什么在springboot中使用autowired的时候它黄色警告说不建议使用字段注入

byType找到多种实现类导致报错 Autowired: 通过byType 方式进行装配, 找不到或是找到多个&#xff0c;都会抛出异常 我们在单元测试中无法进行字段注入 字段注入通常是 private 修饰的&#xff0c;Spring 容器通过反射为这些字段注入依赖。然而&#xff0c;在单元测试中&…...

DeepSeek大模型介绍、本地化部署与使用!【AI大模型】

一、DeepSeek 是什么&#xff1f; 1.技术定位 专注大模型与AGI研究&#xff0c;开发高性能基座模型&#xff08;如 DeepSeek LLM 系列&#xff09;&#xff0c;支持长文本、多模态、代码生成等复杂任务。 提供开源模型&#xff08;如 DeepSeek-MoE、DeepSeek-V2&#xff09;…...

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…...

智能化转型2.0:从“工具应用”到“价值重构”

过去几年&#xff0c;“智能化”从一个模糊的概念逐渐成为企业发展的核心议题。2024年&#xff0c;随着生成式AI、大模型、智能体等技术的爆发式落地&#xff0c;中国企业正式迈入智能化转型的2.0时代。这一阶段的核心特征是从单一场景的“工具应用”转向全链条的“价值重构”&…...

机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 线性代数、微积分、概率论 …...

9.PPT:儿童孤独症介绍【22】

目录 NO12345​ NO6789 NO12345 1-3张素材.txt中的大纲→素材文档PPT.pptx设计→主题→积分字体&#xff1a;幻灯片母版在幻灯片母版右上角的相同位置插入任一剪贴画&#xff0c;改变该剪贴画的图片样式、为其重新着色&#xff0c;并使其不遮挡其他文本或对象 开始→版式动画…...

蓝桥杯嵌入式备赛:STM32G431引脚复用功能表,一张图搞定定时器与ADC配置

蓝桥杯嵌入式备赛&#xff1a;STM32G431引脚复用功能实战指南 在蓝桥杯嵌入式赛场上&#xff0c;STM32G431作为官方指定开发平台的核心控制器&#xff0c;其引脚复用功能的灵活配置往往是决定项目成败的关键。许多参赛选手在紧张激烈的比赛中&#xff0c;常常因为引脚配置错误…...

从南邮实验报告看数据结构:顺序表、链表、二叉树、图,这些实验到底在练什么?

解码数据结构实验&#xff1a;从顺序表到图算法的编程思维进阶之路 当你第一次翻开数据结构实验手册&#xff0c;看到那些关于顺序表、链表、二叉树和图算法的题目时&#xff0c;是否曾困惑过这些看似枯燥的操作练习究竟能带来什么实际价值&#xff1f;南邮的这一系列实验设计绝…...

Excel双坐标折线图保姆级教程:用散点图搞定多组数据对比(附详细步骤图)

Excel双坐标折线图进阶指南&#xff1a;用散点图实现精准数据可视化 在数据分析的日常工作中&#xff0c;我们经常遇到需要同时展示两组量纲差异巨大的数据——比如销售额&#xff08;百万级&#xff09;和增长率&#xff08;百分比&#xff09;。传统的双坐标折线图虽然能解决…...

FreeRTOS实战指南:从消息队列到内存管理,手把手解决嵌入式多任务难题

FreeRTOS实战指南&#xff1a;从消息队列到内存管理&#xff0c;手把手解决嵌入式多任务难题 1. 为什么嵌入式开发者需要FreeRTOS 在资源受限的嵌入式系统中&#xff0c;开发者常常面临这样的困境&#xff1a;既要处理实时性要求高的传感器数据采集&#xff0c;又要兼顾用户界面…...

Python实战:5分钟搞定小红书自动点赞脚本(附完整代码)

Python实战&#xff1a;5分钟实现小红书自动化互动工具开发指南 在当今内容爆炸的时代&#xff0c;社交媒体运营已成为个人品牌和商业推广的重要阵地。小红书作为国内领先的生活方式分享平台&#xff0c;其互动数据直接影响内容曝光和账号权重。对于开发者而言&#xff0c;掌握…...

Apache Spark 解第 8 章附加篇:Structured Streaming 底层机制深度剖析

...

收藏!2026非科班/转行小白必看:3步切入AI大模型,月薪30w+实战路径

2026年的职场赛道&#xff0c;AI大模型依旧是绝对的“黄金风口”。 最新行业报告显示&#xff0c;AI相关岗位需求逆势增长37%&#xff0c;薪资领跑全行业&#xff0c;大厂校招起薪普遍突破25k。但一个残酷的现实是&#xff1a; 太多非科班、半路转行的程序员&#xff0c;还在门…...

打造轻量级Windows系统:Tiny11Builder深度应用指南

打造轻量级Windows系统&#xff1a;Tiny11Builder深度应用指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 价值定位&#xff1a;解决三大系统痛点 你的Windo…...

Python环境变量冲突避坑指南:解决Fatal Python error: init_sys_streams错误(conda+Pycharm版)

Python环境变量冲突避坑指南&#xff1a;解决Fatal Python error: init_sys_streams错误&#xff08;condaPycharm版&#xff09; 当你在PyCharm中运行一个conda虚拟环境下的Python项目时&#xff0c;突然弹出一条令人窒息的错误信息&#xff1a;Fatal Python error: init_sys_…...

从Buck到三电平:软开关DC-DC变换器的Simulink建模与双闭环控制仿真

1. 从Buck到三电平&#xff1a;电力电子技术的进化之路 记得我第一次接触DC-DC变换器时&#xff0c;Buck电路就像是一道必须跨过的门槛。这个经典的降压电路结构简单&#xff0c;却蕴含着电力电子最基础的设计思想。但随着项目需求的提升&#xff0c;传统Buck电路在高压大功率场…...