MySQL之索引详细总结

news2024/12/28 5:21:01

索引简介

        索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查法,这种数据结构就是索引

为什么要使用索引?

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

  2. 可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。

  3. 帮助服务器避免排序和临时表。

  4. 将随机IO变为顺序IO

  5. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

使用索引的注意事项

  1. 在经常需要搜索的列上,可以加快搜索的速度;

  2. 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

  3. 在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

  4. 对于中到大型表索引都是非常有效的,但是特大型表的话维护开销会很大,不适合建索引

  5. 在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;

  6. 避免 where 子句中对字段施加函数,这会造成无法命中索引。--哪些操作会引起索引失效

  7. 在使用InnoDB时使用与业务无关的自增主键作为主键,即使用逻辑主键,而不要使用业务主键。

  8. 删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗 MySQL 5.7 可以通过查询 sys 库的 chema_unused_indexes 视图来查询哪些索引从未被使用

  9. 在使用 limit offset 查询缓慢时,可以借助索引来提高性能

索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

索引结构描述
B+Tree索引最常见的索引类型,大部分引擎都支持B+树索引
Hash索引底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
R-tree(空间索引)空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式。类似于ES,Solr

索引分类

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建,只能有一个PRIMARY
唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

分类含义特点
聚集索引将数据存储于索引放到了一块,索引结构的叶子结点保存了行数据必须有,而且只有一个
二级索引(辅助索引或非聚集索引)将数据与索引分开存储存储,索引结构的叶子结点关联的是对应的主键可以存在多个

聚集索引选取规则

  1. 如果存在主键,主键索引就是聚集索引

  2. 如果不存在索引,将使用第一个唯一索引作为聚集索引

  3. 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引回表查询:先根据二级索引查询的聚集索引,再根据聚集索引拿到想查询的数据

索引操作

  1. 添加PRIMARY KEY(主键索引)
    ALTER TABLE `table_name` ADD PRIMARY KEY (`column`)
  2. 添加UNIQUE(唯一索引)
    ALTER TABLE `table_name` ADD UNIQUE (`column`) 
  3. 添加INDEX(普通索引)
    ALTER TABLE `table_name` ADD INDEX index_name (`column`)
  4. 添加FULLTEXT(全文索引)
    ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 
  5. 添加多列索引
    ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

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

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

相关文章

Java零基础入门-java8新特性(中篇)

一、概述 ​上几期,我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念,而这一期,我们要来玩点好的东西,那就是java8,我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新&…

电商技术揭秘五:电商平台的个性化营销与数据分析

文章目录 引言1. 个性化营销的概念与价值1.1 个性化营销的定义1.1.1 个性化营销的基本概念1.1.2 个性化营销在电商领域的重要性 1.2 个性化营销的核心价值1.2.1 提升用户体验1.2.2 增加转化率和客户忠诚度1.2.3 优化营销资源配置 2. 用户画像与行为分析2.1 用户画像的构建2.1.1…

二百二十九、离线数仓——离线数仓Hive从Kafka、MySQL到ClickHouse的完整开发流程

一、目的 为了整理离线数仓开发的全流程,算是温故知新吧 离线数仓的数据源是Kafka和MySQL数据库,Kafka存业务数据,MySQL存维度数据 采集工具是Kettle和Flume,Flume采集Kafka数据,Kettle采集MySQL数据 离线数仓是Hi…

Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件

Topaz Video AI for Mac是一款功能强大的视频处理软件,专为Mac用户设计,旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术,能够自动识别和分析视频中的各个元素,并进行智能修复和增强&…

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

docker容器环境安装记录(MAC M1)(完善中)

0、背景 在MAC M1中搭建商城项目环境时,采用docker统一管理开发工具,期间碰到了许多环境安装问题,做个总结。 1、安装redis 在宿主机新建redis.conf文件运行创建容器命令,进行容器创建、端口映射、文件挂载、以指定配置文件启动…

《QT实用小工具·八》数据库通用翻页类

1、概述 源码放在文章末尾 该项目实现数据库通用翻页类,主要包含如下功能: 1:自动按照设定的每页多少行数据分页 2:只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签 3:提供公共静态方法绑定字段数据到下拉框 4:建议条件字段用数字类型的主…

37.HarmonyOS鸿蒙系统 App(ArkUI) 创建第一个应用程序hello world

HarmonyOS App(ArkUI) 创建第一个应用程序helloworld 线性布局 1.鸿蒙应用程序开发app_hap开发环境搭建 3.DevEco Studio安装鸿蒙手机app本地模拟器 打开DevEco Studio,点击文件-》新建 双击打开index.ets 复制如下代码: import FaultLogger from ohos.faultL…

SpringBoot+ECharts+Html 字符云/词云案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 2. 准备条件 在mysql中创建数据库echartsdb,数据库中创建表t_comment表,表中设置两个字段word与count,添加表中的数据。如:附件中的 echartsdb.sql 3. SpringBoot…

将excel数据拆分成多个excel文件

一、背景: 平时在日常工作中,经常需要将excel的文件数据进行拆分,拆分成多个excel文件,然而用人工来处理这个既耗时,又费精力,眼睛会疲劳,时间长了操作上会出现失误,导致数据拆分错…

BetterZip2024Mac上一款功能强大的Mac平台解压压缩软件

一、软件概述 BetterZip是一款Mac平台上的压缩解压缩工具,它为用户提供了一个方便的方式来处理各种压缩文件,包括但不限于ZIP、TAR、GZIP等格式。除了基本的压缩解压缩功能外,BetterZip还具备文件预览、文件加密、分卷压缩等高级功能&#x…

JUC:double-checked locking(DCL) 懒汉单例模式

文章目录 double-checked locking(DCL) 问题解决方法 volatile作用 double-checked locking(DCL) 问题 第一个if用于后续进入的线程,不用再获取锁来判断是否已经创建了对象。第二个if,为的是第一个进入的线程创建对象,以及防止卡在第一个if之…

nodeJs 实现视频的转换(超详细教程)

前段时间拿到一个视频是4k的,没法播放,于是通过 node.js 和 ffmpeg 实现了视频的转换。在win10 系统下实现。 所需工具 node 16.19 直接安装 ffmpeg-5.1.1-essentials_build 解压后重名 ffmpeg 放到C盘 然后配置下环境变量 Git-2.42.0.2-64-bit 直接…

【HTML】注册页面制作 案例二

(大家好,今天我们将通过案例实战对之前学习过的HTML标签知识进行复习巩固,大家和我一起来吧,加油!💕) 案例复习 通过综合案例,主要复习: 表格标签,可以让内容…

linux通过进程pid查询容器docker

我遇到的问题是在docker中启动了进行,占用显卡,如下nvidis-smi查看: 现在要查询pid16325属于哪个容器ID,指令: ps -e -o pid,cmd,comm,cgroup | grep 16325查到如下结果,其中12:cpuset:/docker/ 后面的 8…

算法打卡day32|贪心算法篇06|Leetcode 738.单调递增的数字、968.监控二叉树

算法题 Leetcode 738.单调递增的数字 题目链接:738.单调递增的数字 大佬视频讲解:单调递增的数字视频讲解 个人思路 这个题目就是从例子中找规律,例如 332,从后往前遍历,32不是单调递增将2变为9,3减1,变成了329&…

浏览器工作原理与实践--WebAPI:XMLHttpRequest是怎么实现的

在上一篇文章中我们介绍了setTimeout是如何结合渲染进程的循环系统工作的,那本篇文章我们就继续介绍另外一种类型的WebAPI——XMLHttpRequest。 自从网页中引入了JavaScript,我们就可以操作DOM树中任意一个节点,例如隐藏/显示节点、改变颜色、…

HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问

场景介绍 典型跨应用访问数据的用户场景下,数据提供方会存在多次被拉起的情况。 为了降低数据提供方拉起次数,提高访问速度,OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式,即静默数据访问。 静默数据访问通过数据…

社交媒体市场:揭示Facebook的商业模式

在数字化时代,社交媒体已经成为人们生活中不可或缺的一部分。Facebook作为全球最大的社交媒体平台之一,其商业模式的运作方式对于了解社交媒体市场的发展趋势和影响力至关重要。本文将深入探讨Facebook的商业模式,剖析其运作机制,…

用户体验:探讨Facebook如何优化用户体验

在数字化时代,用户体验是社交媒体平台成功与否的关键因素之一。作为全球最大的社交媒体平台之一,Facebook一直在努力优化用户体验,从功能设计到内容呈现再到隐私保护,不断提升用户满意度。本文将深入探讨Facebook如何优化用户体验…