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

【MySQL 进阶之路】索引的使用

5.索引的使用规则

数据库管理系统(DBMS)中,索引是提高查询效率的关键机制之一。MySQL索引优化是指通过设计、调整和选择合适的索引策略,以提高数据库的查询性能和降低资源消耗。以下是一些关键的索引使用规则:

1. 最左前缀法则

  • 定义:联合索引的使用顺序必须从索引的最左列开始。查询时,如果跳过联合索引的最左边某一列,后续列的索引将失效。
  • 例子
    CREATE INDEX idx_example ON table(a, b, c); 
    
    如果查询条件是 (a=1 AND b=2),会使用索引 idx_example。但如果查询条件是 (b=2 AND a=1),索引可能失效。

2. 索引列运算

  • 定义:尽量避免在索引列上进行运算操作(例如 +, -, *, =, LIKE 等),这会导致索引失效,影响查询效率。

  • 例子

    • 错误用法:WHERE YEAR(date_column) = 2024。此操作会使得 date_column 列的索引失效。
    • 正确用法:WHERE date_column >= '2024-01-01' AND date_column < '2025-01-01'

3. OR 和 AND 连接条件

  • 定义:在条件中使用 OR 时,如果 OR 前的条件使用了索引,而后面的条件没有使用索引,可能导致查询效率低下,因为 MySQL 会做全表扫描。
  • 例子
     -- 使用索引列        where column1 = 1 OR column2 = 2;
    

如果 column1 上有索引,而 column2 上没有,MySQL 会先用索引扫描 column1 = 1,然后再全表扫描来处理 column2 = 2,这会导致索引的部分失效。

4. 数据分布影响

  • 定义:如果 MySQL 评估发现使用索引的效率低于全表扫描时(例如索引选择性差,表的数据分布不均匀),则会选择不使用索引。
  • 例子:在某个字段值高度重复的情况下(如性别字段 malefemale),使用索引的效果不好,MySQL 会倾向于选择全表扫描。

5. SQL 提示

  • 定义:在复杂的查询中,我们可以通过 SQL 提示(Hint)来强制使用指定的索引,或者忽略某个索引,从而影响查询优化的执行。

  • 常见 SQL 提示

    • USE INDEX (index_name):强制查询使用指定的索引。
    • IGNORE INDEX (index_name):忽略指定的索引。
    • FORCE INDEX (index_name):强制查询使用指定的索引,即使 MySQL 认为不需要使用该索引。
  • 例子

SELECT * FROM table USE INDEX (idx_example) WHERE column1 = 10;

6. 覆盖索引

  • 定义:覆盖索引是指查询所需的所有字段都可以从索引中直接获取,而无需回表查询。这样可以显著提高查询效率。
  • 使用场景:覆盖索引通常用于 SELECT 查询,只涉及索引字段的查询,且避免使用 SELECT *
  • 例子
    假设有一个联合索引 idx_example (a, b, c),且查询只需要返回 ab 列:
    SELECT a, b FROM table WHERE a = 10 AND b = 20;
    此时,如果有 idx_example 索引,则可以直接通过索引返回结果,而不需要访问数据表。

7. 索引失效情况

  • 常见情况

    1. 运算操作:如 WHERE column1 + column2 = 10column1 * 2 = 100 等,运算会导致索引失效。
    2. 字符串未加单引号:例如 WHERE name = test,应改为 WHERE name = 'test'
    3. 头部模糊查询:如 WHERE column LIKE '%value%',这种查询无法利用前缀索引优化,效率低。
    4. OR 和 AND 连接条件:如果条件不完全使用索引,可能会导致部分索引失效。
  • 例子

     -- 错误:运算操作会导致索引失效SELECT * FROM table WHERE salary + bonus = 5000;-- 错误:未加单引号SELECT * FROM table WHERE name = test;  -- 错误,test 应加引号-- 错误:头部模糊查询SELECT * FROM table WHERE name LIKE '%abc%';  -- 头部模糊查询无法利用索引-- 错误:OR 连接条件中,后半部分没有索引SELECT * FROM table WHERE column1 = 1 OR column2 = 2;  -- 如果 column2 没有索引,可能导致效率低
    
总结:
  1. 最左前缀法则是联合索引的核心,必须遵循。
  2. 尽量避免在索引列上进行运算。
  3. ORAND 连接条件中的索引使用要谨慎。
  4. 覆盖索引是查询优化的关键手段。
  5. 使用 SQL 提示时,合理选择索引来优化查询。
  6. 注意索引失效的常见情况,避免不必要的性能损耗。

遵循索引的使用规则,尤其是最左前缀法则、避免索引列运算、合理使用 ORAND 连接条件、利用覆盖索引及 SQL 提示,可以有效提升查询性能。同时,避免常见的索引失效情况,才能确保数据库查询的高效执行。

相关文章:

【MySQL 进阶之路】索引的使用

5.索引的使用规则 在数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;索引是提高查询效率的关键机制之一。MySQL索引优化是指通过设计、调整和选择合适的索引策略&#xff0c;以提高数据库的查询性能和降低资源消耗。以下是一些关键的索引使用规则&#xff1a; 1. …...

网络编程相关 API 学习

目录 1. 网络编程中的基本概念 2. UDP 的 socket api 的使用 (1) DatagramSocket API (2) DatagramPacket API (3) InetSocketAddress API (4) 使用 UDP 的 socket api 3. TCP 的 socket api 的使用 (1) ServerSocket API (2) Socket API 1. 网络编程中的基本概念 客…...

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word&#xff08;1&#xff09;打开文档&#xff08;2&#xff09;添加标题&#xff08;3&#xff09;添加段落&#xff08;4&#xff09;添加文字块&#xff08;5&#xff09;添加图片&#xff08;6&#xf…...

【笔记2-1】ESP32:基于vscode的espidf插件的开发环境搭建

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…...

集成网关 -- 新节点的开发说明

在node-red中&#xff0c;nVisual节点可以帮助我们更快快简捷的完成新的功能&#xff0c;今天我来分享一下关于node-Red中关于nVisual新节点开发基础教程。 首先来看一下基本node-red节点文件目录&#xff0c;当前新开发的7个节点都放在了“node-red\packages\node_modulesno…...

【Gitlab】CICD使用minio作为分布式缓存

1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…...

️️耗时一周,肝了一个超丝滑的卡盒小程序

前言 先看看成品效果&#xff1a; 在上个月&#xff0c;我出于提升自己的英语造句能力的目的&#xff0c;想要找一个阅读或者练习造句类的英语学习 APP&#xff0c;但是最终找了几个 APP 不是不太好用就是要付费。于是我转换思路&#xff0c;找到了一本书&#xff0c;叫《36…...

网络安全审计

网络安全审计是为了确保网络系统的安全性和完整性&#xff0c;防范潜在的网络攻击和数据泄露风险。 审计步骤&#xff1a; 1.确定审计目标&#xff1a;明确审计的目的和范围&#xff0c;例如审计网络设备、服务器、应用程序或数据库等。 2.收集信息&#xff1a;收集审计范围…...

论文:IoU Loss for 2D/3D Object Detection

摘要&#xff1a;在2D/3D目标检测任务中&#xff0c;IoU (Intersection-over- Union)作为一种评价指标&#xff0c;被广泛用于评价不同探测器在测试阶段的性能。然而&#xff0c;在训练阶段&#xff0c;通常采用常见的距离损失(如L1或L2)作为损失函数&#xff0c;以最小化预测值…...

2411mfc,修改按钮颜色

添加消息:ON_WM_CTLCOLOR() //在OnInitDialog()方法中添加{HWND hSatateWnd GetDlgItem(IDC_CHK)->GetSafeHwnd();SetWindowTheme(hSatateWnd, _T(""), _T(""));}头文件中: afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);HBRUSH O…...

互联网 Java 面试八股文汇总(2025 最新整理)

我分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#xff0c;都…...

如何在 Ubuntu 中更新 Linux 内核

Linux内核是操作系统的基础&#xff0c;对操作系统的性能起着至关重要的作用。Linux开发人员通过补丁和更新不断增强内核&#xff0c;解决安全性、功能性和速度问题。及时了解这些发展对于确保机器以最佳方式运行至关重要。 本文教您如何使用三种不同的方法更新 Ubuntu 中的 L…...

FilterListenerAjax

今日目标: 能够使用 Filter 完成登陆状态校验功能能够使用 axios 发送 ajax 请求熟悉 json 格式,并能使用 Fastjson 完成 java 对象和 json 串的相互转换使用 axios + json 完成综合案例1,Filter 1.1 Filter概述 Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、…...

27. 移除元素 C++

文章目录 一、题目链接二、参考代码三、所思所悟 一、题目链接 链接: 27. 移除元素 二、参考代码 思路1&#xff1a;找到需要移除的数组元素&#xff0c;将右侧全部元素向左覆盖 int removeElement(vector<int>& nums, int val) {int size nums.size();for (int …...

大模型专栏--Spring Ai Alibaba介绍和功能演示

Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建&#xff0c;是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践&#xff0c;提供高层次的 AI API 抽象与云原生基础设施集成方案&#xff0c;帮助开发者快速构建 AI 应用。…...

Redis设计与实现第17章 -- 集群 总结2(执行命令 重新分片)

17.3 在集群中执行命令 接收命令的节点会计算出命令要处理的数据库键属于哪个槽&#xff0c;并检查这个槽是否指派给了自己&#xff1a; 如果是的话&#xff0c;直接执行这个命令 否则&#xff0c;节点向客户端返回一个MOVED错误&#xff0c;指引客户端转向redirect至正确的节…...

微服务搭建----springboot接入Nacos2.x

springboot接入Nacos2.x nacos之前用的版本是1.0的&#xff0c;现在重新搭建一个2.0版本的&#xff0c;学如逆水行舟&#xff0c;不进则退&#xff0c;废话不多说&#xff0c;开搞 1、 nacos2.x搭建 1&#xff0c;首先第一步查询下项目之间的版本对照&#xff0c;不然后期会…...

3.建立本地仓库及常用命令

1.建立本地仓库 要使用Git对我们的代码进行版本控制&#xff0c;首先需要获得本地仓库 1&#xff09;在电脑的任意位置创建一个空目录&#xff0c;作为我们的本地Git仓库 2&#xff09;进入这个目录&#xff0c;右键点击Git Bash 窗口 3&#xff09;执行命令git init 4) 如果创…...

linux arm下获取屏幕事件(rk3588)

1、找到屏幕设备名称 cat /proc/bus/input/devices我的屏幕设备是ILITEK ILITEK-TP&#xff0c;它的设备名称是event1. 2、读取屏幕事件。 方法1&#xff1a; cat /dev/input/event1 | hexdump方法2&#xff1a; 3、c代码实现 #include <stdio.h> #include <unis…...

【机器学习】人工智能与气候变化:利用深度学习与机器学习算法预测和缓解环境影响

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f525;引言 1.1 背景介绍 1.2 人工智能与机器学习的崛起 1.3 本文内容概述 &#x1f528;气候变化的挑战 2.1 现今气候变化带来的影响和挑战 2.2 引发关注的气候变化趋势和数据 &#x1f916;人工智能…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...