技术总结(四十一)
一、MySQL 索引概述
- 索引的概念:索引就好比一本书的目录,它能帮助 MySQL 快速定位到表中的数据行,而不用全表扫描。通过创建合适的索引,可以大大提高查询的效率。例如,在一个存储了大量员工信息的表中,如果经常要根据员工的工号来查询员工记录,为工号字段创建索引后,数据库就能快速找到对应记录,而不是逐行去检查表中的每一条数据。
- 索引的类型:
- B-Tree 索引(默认常用的索引类型):它以 B 树数据结构来存储索引数据,适用于全键值、键值范围和键前缀查找等情况。像常见的
INT
、VARCHAR
等类型的字段创建索引时,一般就是 B-Tree 索引,比如在一个电商商品表中,对商品编号、商品名称等字段创建的索引往往就是 B-Tree 索引。 - 哈希索引:基于哈希表实现,只支持等值查询(也就是
=
、<=>
操作符),对于范围查询等就不太适用了。例如在一些缓存系统中,如果只是简单地根据某个唯一标识快速查找对应缓存值,哈希索引可能比较合适。不过在 MySQL 中,哈希索引主要是在内存存储引擎(如 Memory 引擎)中使用,InnoDB 和 MyISAM 等常用存储引擎默认的索引不是哈希索引。 - 全文索引:主要用于在文本类型字段(比如
TEXT
、VARCHAR
等较长文本字段)中进行全文搜索,能够帮助查找包含特定关键词的文本内容。例如在一个博客文章表中,要查找包含特定关键词的文章内容,就可以使用全文索引,它支持一些复杂的文本匹配语法,像MATCH AGAINST
语句来实现模糊搜索功能。
- B-Tree 索引(默认常用的索引类型):它以 B 树数据结构来存储索引数据,适用于全键值、键值范围和键前缀查找等情况。像常见的
二、索引优化的原则
- 选择合适的字段创建索引:
- 经常出现在
WHERE
子句中的字段:比如在电商订单表中,如果经常根据订单状态(如已支付、已发货等状态)来查询订单,那就应该给订单状态字段创建索引,这样查询满足特定状态的订单时效率会显著提高。 - 用于连接操作(
JOIN
)的字段:例如在多表查询中,有订单表和用户表通过用户 ID 进行关联查询,如果在两个表中对应的关联字段(用户 ID)都创建了索引,那么在执行连接操作时数据库就能更快地匹配关联记录,减少数据匹配的时间开销。 - 字段区分度高的:区分度简单理解就是某个字段不同值的数量占总记录数的比例。像性别字段只有男、女两种值,区分度就很低,如果对它创建索引,在查询时可能并不能很好地缩小查找范围,而身份证号等唯一性高、区分度极高的字段创建索引,对查询效率提升作用明显。
- 经常出现在
- 避免过度索引:
- 索引不是越多越好:每一个索引都需要额外的存储空间来保存索引数据,并且在对表进行插入、更新、删除操作时,数据库需要同时维护索引数据的一致性,过多的索引会导致这些操作变得很慢。比如一个简单的小型日志表,本身数据量不大且查询场景很单一,如果创建大量索引,反而会让插入新日志记录的速度变得很慢,影响整体性能。
- 定期评估索引的有效性:随着业务的发展和数据的变化,有些之前创建的索引可能不再常用或者作用不大了,需要定期去查看索引的使用情况(可以通过数据库的相关性能分析工具查看索引是否被查询使用等情况),对于不再有用的索引进行删除优化。
三、具体的优化策略
- 复合索引的合理使用:
- 遵循最左前缀原则:如果创建了一个包含多个字段的复合索引(比如在员工表中创建了
(name, age, department)
这样的复合索引),在查询时,只有按照索引中字段的顺序从左到右使用字段进行条件查询时,索引才会被有效利用。例如WHERE name = '张三' AND age = 30
这样的查询能用到复合索引,而WHERE age = 30 AND department = '研发部'
就不能完全利用这个复合索引,因为跳过了最左边的name
字段。 - 合理确定复合索引的字段顺序:将区分度高、选择性好且经常用于查询条件的字段放在复合索引的前面。比如在一个学生成绩表中,如果经常根据课程名称和成绩范围来查询学生记录,课程名称的区分度一般比成绩的区分度高(课程种类相对固定,成绩是个数值范围),那创建复合索引时可以写成
(course_name, score)
这样的顺序。
- 遵循最左前缀原则:如果创建了一个包含多个字段的复合索引(比如在员工表中创建了
- 优化查询语句以更好利用索引:
- 避免在索引字段上使用函数操作:例如在一个存储日期的字段
create_date
上创建了索引,如果查询语句写成WHERE YEAR(create_date) = 2024
,数据库在执行时就无法直接利用索引了,因为对索引字段进行了函数运算。正确的做法是尽量将条件改写成可以直接匹配索引的形式,比如通过日期范围等方式来查询 2024 年的数据(WHERE create_date >= '2024-01-01' AND create_date <= '2024-12-31'
)。 - 避免使用
OR
连接条件(除非每个OR
分支都能利用索引):比如WHERE status = 1 OR name = '李四'
这样的查询,如果status
字段和name
字段分别有索引,但是数据库在处理OR
连接时往往很难同时有效利用这两个索引,可能会导致全表扫描。可以考虑改写查询逻辑,比如通过UNION
操作等方式来分别查询满足不同条件的记录后再合并结果,提高查询效率。
- 避免在索引字段上使用函数操作:例如在一个存储日期的字段
- 根据数据量和业务场景选择合适的存储引擎及索引策略:
- InnoDB 存储引擎:支持事务、行级锁等特性,适合对数据一致性、并发控制要求高的业务场景。它的索引结构(默认 B-Tree 索引)配合其聚簇索引(主键索引的数据行和索引数据存储在一起)的特点,在很多情况下能高效地支持查询、插入等操作。例如在一个电商系统中,商品表、订单表等核心数据表使用 InnoDB 存储引擎,通过合理创建索引(如对商品的分类字段、订单的用户 ID 字段等创建索引)可以很好地满足业务的查询和更新需求。
- MyISAM 存储引擎:不支持事务,但是在一些以读为主的简单应用场景中,它的表级锁机制和索引结构(同样有 B-Tree 索引等)在查询性能上也有不错的表现,特别是在数据量不是特别巨大且并发访问不是很复杂的情况下。比如一个小型的企业公告信息表,使用 MyISAM 存储引擎,对公告标题等字段创建索引,方便员工快速查询相关公告内容。
相关文章:
技术总结(四十一)
一、MySQL 索引概述 索引的概念:索引就好比一本书的目录,它能帮助 MySQL 快速定位到表中的数据行,而不用全表扫描。通过创建合适的索引,可以大大提高查询的效率。例如,在一个存储了大量员工信息的表中,如果…...
Android布局
一、线性布局 属性:orientation vertical horizontal layout_weight【水平均分,width"0dp"】 layout_height layout_width 小动物连连看 1<?xml version"1.0" encoding"utf-8"?>2<LinearLayout xmlns:and…...
k8s集成skywalking
如果能科学上网的话,安装应该不难,如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容,对于目前大部分采用微服务架构的公司来说,分布式链路追踪都是必备的,无论它是传统微服务体系亦或是新一代…...
如何写一份优质技术文档
作者简介: 本文作者拥有区块链创新专利30,是元宇宙标准化工作组成员、香港web3标准工作组成员,参与编写《数据资产确权与交易安全评价标准》、《链接元宇宙:应用与实践》、《香港Web3.0标准化白皮书》等标准,下面提供…...
LeetCode:206.反转链表
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:206.反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例…...
详解高斯消元
详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...
Maven - 优雅的管理多模块应用的统一版本号
文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...
国际网络安全趋势
1. 亲近拥抱人工智能自动化。 随着安全协调、人工智能自动化和响应(SOAR)的日益普及,人工智能自动化开始成为现实并将继续扩展到其他安全行动领域。寻求将人工智能自动化整合到原有的工具中,通过将威胁情报整合在一起,将其转换为可用格式并主…...
基于米尔全志T527开发板的FacenetPytorch人脸识别方案
本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。 一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实…...
Altium Designer脚本工具定制
原理图设计自动化 ➡️Altium原理图检查工具 ➡️元器件参数集导入导出 ➡️原理图符号自动创建 ➡️原理图高级查找 ➡️原理图库文档高级查找 ➡️原理图文档对比 ➡️原理图库文档对比 PCB设计自动化 ➡️各种各样的PCB线圈自动创建 ➡️PCB文档导出成SVG格式文档…...
贝锐自研智慧网关系统OrayOS升级,适配Banana PI开发板BPI-R3 Mini
为了满足多元化的应用场景,贝锐与Banana PI携手合作,贝锐自研新一代云智慧网关系统OrayOS不仅已成功适配BPI-R3,还进一步扩展至BPI-R3 Mini,提供了更丰富的选择。在全球工业物联网、视频监控管理以及企业级办公存储等领域…...
搭建环境-PHP简介及环境搭建教程
搭建环境-PHP简介及环境搭建教程 前言 在现代Web开发中,PHP是一种广泛使用的服务器端脚本语言,它以简洁、高效和跨平台的特性受到开发者的青睐。无论是小型网站还是大型企业应用,PHP都能提供强大的支持。本文将为您详细介绍PHP的基本概念、特点,以及如何搭建PHP开发环境。…...
Maven 配置
参考学习: eclipse(或myeclipse)通过maven配置连接neo4j_eclipse 链接 neo4j-CSDN博客 爆肝十小时—我终于用Java连上Neo4j数据库 - 知乎 全站最全Maven下载安装配置教学(2024更新...全版本)建议收藏...赠送IDEA配置Ma…...
js常见函数实现
文章目录 一、数组Array1、forEach2、filter3、map4、reduce5、find6、findIndex7、includes8、join 二、对象Object1、Object.keys2、深复制 js环境中有很多工具函数,比如es6添加了很多新的属性和方法,这些方法也可以自定义实现,但是官方也提…...
点云3DHarris角点检测算法推导
先回顾2D的Harris角点检测算法推导 自相关矩阵是Harris角点检测算法的核心之一,它通过计算图像局部区域的梯度信息来描述该区域的特征。在推导Harris角点检测算法中的自相关矩阵时,我们首先需要了解自相关矩阵的基本思想和数学背景。 参考 1. 能量函数…...
mysql-binlog的三种模式
MySQL的binlog(二进制日志)有三种主要模式,分别是Statement、Row和Mixed。这三种模式在记录数据库更改的方式上有显著的区别,以下是对这三种模式的详细解释及对比: 一、Statement模式(基于SQL语句的复制&a…...
自动类型推导(auto 和 decltype);右值引用和移动语义
1) 自动类型推导(auto 和 decltype) 自动类型推导(auto) 在C11及以后的版本中,auto关键字被引入用于自动类型推导。这意味着编译器会自动推断变量的类型,基于其初始化的表达式。使用auto可以让代码更加简…...
(Linux 系统)进程控制
目录 一、进程创建 1、fork函数初识 二、进程终止 1、正常终止 2、异常终止 三、进程等待 1、进程等待必要性 2、进程等待的方法: 四、获取子进程status 1、基本概念 2、进程的阻塞等待方式 3、进程的非阻塞等待方式 五、进程程序替换 1、六种替换函数…...
【Nativeshell】flutter的pc跨平台框架学习记录<二> 窗口间通信
首先是初始化: 查看Nativeshell的demo代码 // ignore_for_file: undefined_hidden_name, // not in main import package:flutter/material.dart hide MenuItem; import package:nativeshell/nativeshell.dart;import pages/other_window.dart; import pages/plat…...
今日codeforces刷题(1)
一、前言 新栏目,每隔几天就保质保量地刷个10道codeforces题左右的样子 筛选1200-1500难度的题,然后按通过题目的人数降序排列的前10题 二、题目总览 三、具体题目 3.1 25A. IQ test 我的代码 看奇数出现的次数为1还是偶数出现的次数为1,…...
【C++算法】20.二分查找算法_x 的平方根
文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 69. x 的平方根 题目描述: 解法 暴力解法: 如果x17 从1,2,3,4,5......这些数里面找他们的平方…...
图像显示的是矩阵的行和列,修改为坐标范围。
x 3; y 3; f1x x^2 y^2; guance1 f1x; F (x, y) sqrt((x.^2 y.^2 - guance1).^2); % 使用点乘 [x, y] meshgrid(0:1:5, 0:1:5); Z F(x, y); figure; imagesc(Z); % 由于 imagesc 使用矩阵索引作为坐标,我们需要手动添加刻度 % 这里我们假设 x 和 y 的范围…...
通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报
云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。 趋势热点 🥇 通义灵码走进北京大学创新课堂,与 400…...
LeetCode Hot100 1~10
目录 哈希1. 两数之和2. 字母异位词分组3. 最长连续子序列 双指针4. 移动零5. 盛最多水的容器6. 三数之和7. 接雨水 子串8. 无重复字符的最长子串9. 找到字符中所有字母的异位词10. 和为K的子数组 哈希 1. 两数之和 利用哈希表找出当前数字还差多少 看看差值时候在哈希表中即…...
npm 最新国内淘宝镜像地址源 (旧版已不能用)
注意:原域名https://registry.npm.taobao.org/ 在 2022.06.30 号正式下线和停止 DNS 解析 最新地址: #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com 查看镜像使用状态 npm config get registr…...
DepthAI 2.29版本 发布
2024年11月29日 增加在设备运行时使用新的 dai::Device.setCalibration() 更改设备校准能力的方法,并使用 dai::Device.getCalibration() 进行检索校准 1🍃 新的立体深度预设属性: 预设 面部 高细节 机器人 2🍃 多项摄像…...
C#反序列化XML时提示XML 文档(1, 1)中有错误
最近在反序列化一个XML时,遇到了如下报错: XML 文档(1, 1)中有错误。 内部异常 XmlException: 根级别上的数据无效。 第 1 行,位置 1。 看描述应该是XML格式的问题,我把XML复制到新建的控制台程序,反序列化又是可以的…...
C# 中的接口:定义行为契约与实现多态性
C#中的接口(Interfaces)。接口是C#中一个非常重要的特性,它允许定义类型的行为契约,而不指定具体实现。通过接口,可以实现多态性、代码的灵活性和可扩展性。以下是一篇关于C#中接口的文章。 引言 接口(Int…...
Redis的基础知识·
Redis是一个基于内存的key-value的结构数据库 基于内存存储 读写性能高适合存储热点数据(热点商品 咨询 新闻) 开启Redis 首先输入命令 redis-server.exe redis.windows.conf 然后重新打开命令行窗口 输入命令 redis-cli.exe 输入密码 …...
qt QProxyStyle详解
1、概述 QProxyStyle是Qt框架中QStyle类的一个子类,它提供了一种代理机制,允许开发者在不直接修改现有样式(QStyle)实现的情况下,对样式行为进行定制或扩展。通过继承QProxyStyle,开发者可以重写其虚方法&…...
阿里巴巴的网站建设与维护/seo线上培训班
(一)strcmp (例题:http://blog.csdn.net/yanyanwenmeng/article/details/77434453) strcmp(字符串名1,字符串名2):比较字符串1和字符串2的大小,比较的结果由函数带回; 1. 如果字符串…...
杭州微网站建设/百度seo排名优化公司
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让…...
服饰工厂网站建设/全球搜索引擎排名2021
通过nano或者vim更改~/.bashrc或/etc/bashrc,两者的区别,前者是针对单用户,后者针对全局用户。 在文件末尾插入一行alias namestring : 给命令起别名(可以先用type string检测这个名字是否被用过了) 例如: …...
网站的图片滚动怎么做的/爱站网长尾关键词挖掘查询工具
针对每个测试需求设计测试用例,测试用例设计的遵守的原则: 1.每一个测试需求至少有一个测试用例与之对应; 2. 每个测试用例包含的测试步骤尽量不要超过10个;如果过多就进行拆分; 3. 每一步step只包含有一种情况&#x…...
不会被封的网站谁做/直播营销策略有哪些
BERT (Bidirectional Encoder Representations from Transformers) 是一种自然语言处理 (NLP) 中用来进行语言模型预训练的模型。它是在 transformer 模型的基础上开发的,能够自动学习语言之间的关系,并且具有较强的语义理解能力。 以下是一个简单的 BERT 模型结构的 C 语言实…...
网站开发需要考虑哪些方面/seo人才网
json-server获取服务器数据只能用get方式,而express支持post方式获取数据 express 一般项目中均安装,若未安装 npm install express --savebuild文件夹webpack.dev.config.js添加设置 //支持post mock数据 var express require(express); //启动expr…...