一文彻底搞懂MySQL索引

文章目录

  • 1. 索引的优缺点
  • 2. 创建索引准则
  • 3. 索引的分类
  • 4. 索引实现
  • 5. 操作索引

1. 索引的优缺点

MySQL索引是一种数据结构,用于提高数据库查询效率。它可以快速定位到表中符合特定条件的数据行,从而加快查询速度。索引通常是根据表中的一个或多个字段创建的,它们存储了对应字段值的排序方式和位置信息,使得数据库系统可以更快地定位到所需的数据行。

1.索引的优点

  • 提高检索速度:索引可以加快数据检索的速度,特别是在大型数据表中,可以显著减少查询所需的时间。
  • 加速排序:索引可以加速排序操作,例如ORDER BY和GROUP BY,提高查询效率。
  • 提高数据的唯一性和完整性:可以通过唯一索引和主键索引来确保数据的唯一性和完整性。
  • 支持快速查找:索引可以提供快速的查找功能,使得查询更加灵活和高效。
  • 减少IO访问次数:索引可以减少磁盘IO访问次数,提高数据库的性能。

2.索引的缺点

  • 占用空间:索引会占用额外的存储空间,特别是在大型数据表中,索引可能会占用大量的磁盘空间。
  • 维护成本高:索引需要定期维护,包括创建、更新和删除索引,这可能会增加数据库的负担和维护成本。
  • 增加写操作的时间:对表进行插入、更新和删除操作时,索引也需要进行相应的更新,这可能会增加写操作的时间。
  • 不适用于所有查询:并非所有的查询都适合使用索引,有些查询可能会因为索引而变得更慢,因此需要根据实际情况选择合适的索引策略。
  • 索引失效:如果索引选择不当或者使用不当,可能会导致索引失效,从而影响查询性能。

2. 创建索引准则

  1. 选择合适的字段:选择常用于查询、排序和连接操作的字段来创建索引,例如经常出现在WHERE子句、JOIN子句、ORDER BY子句和GROUP BY子句中的字段。
  2. 考虑字段的基数:基数是指字段中唯一值的数量。选择基数高的字段来创建索引,因为基数越高,索引的选择性越好,查询效率也就越高。
  3. 避免过多的索引:不要为每个字段都创建索引,因为过多的索引会增加维护成本、占用存储空间,并可能导致索引失效。根据实际情况选择需要索引的字段。
  4. 考虑查询的性能需求:根据查询的性能需求选择合适的索引类型。例如,对于需要快速定位的查询,可以选择B树索引;对于范围查询和模糊查询,可以选择哈希索引。
  5. 注意索引的顺序:对于复合索引,要注意字段的顺序。通常情况下,将区分度高的字段放在前面,以提高索引的选择性。
  6. 避免在频繁更新的字段上创建索引:频繁更新的字段会导致索引的频繁更新和维护,可能会影响性能。因此,不建议在频繁更新的字段上创建索引。
  7. 定期维护索引:定期检查并维护索引,包括重新组织索引、重新构建索引等操作,以确保索引的有效性和性能。

3. 索引的分类

在MySQL中,索引可以根据不同的分类方式进行逻辑分类和物理分类。

1.逻辑分类

逻辑分类是根据索引的使用方式和作用范围来进行分类的,常见的逻辑分类包括:

  • 单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。
  • 组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值.
  • 主键索引:是一种特殊的唯一索引,不允许有空值。
  • 全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。
  • 空间索引:空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。

2.物理分类

物理分类是根据索引在存储引擎中的实现方式来进行分类的,常见的物理分类包括:

  • B-Tree索引:基于B-Tree数据结构实现的索引,适用于范围查找和排序。
  • Hash索引:基于哈希表实现的索引,适用于等值查找。
  • 全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。
  • 空间索引:空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。

4. 索引实现

索引是在存储引擎中实现的,也就是说不同的存储引擎,会采用不同的索引实现方式。常见的MySQL存储引擎包括MyISAM、InnoDB、Memory等,它们在索引实现上有一些区别。

MyISAM

  • MyISAM 使用 B+ 树作为索引结构,包括主键索引和辅助索引(非主键索引)。
  • 主键索引是按照主键顺序构建的 B+ 树,非主键索引也是构建在相应的字段值上的 B+ 树。
  • MyISAM 的索引文件和数据文件是分开存储的,因此索引文件和数据文件是两个独立的文件。

InnoDB

  • InnoDB 也使用 B+ 树作为索引结构,包括主键索引和辅助索引。
  • InnoDB 的主键索引和数据文件是绑定在一起的,因此主键索引也称为聚簇索引,它的叶子节点存储的是完整的行数据。
  • 辅助索引(非主键索引)的叶子节点存储的是对应行数据的主键值,而不是完整的行数据。
  • InnoDB 的索引文件和数据文件是交叉存储的,即数据和索引都存储在同一个表空间文件中。

Memory(也称为 Heap)

  • Memory 存储引擎主要是基于内存的存储,不会将数据写入磁盘,因此适用于一些对读写速度要求高、数据量小且不需要持久化的场景。
  • Memory 存储引擎的索引是使用哈希表实现的,因此查找速度非常快。
  • 由于 Memory 存储引擎不支持持久化,一旦 MySQL 服务器关闭,存储在内存中的数据就会丢失。

InnoDB 和 MyISAM 在索引实现上都采用了 B+ 树结构,但是在主键索引和数据存储上有一些差异。InnoDB 的主键索引和数据文件是绑定在一起的,而 MyISAM 的索引文件和数据文件是分开存储的。

5. 操作索引

1.创建索引

在 MySQL 中,可以使用 CREATE INDEX 语句创建索引。语法如下:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_nameON table_name (column1 [(length)] [ASC|DESC], column2 [(length)] [ASC|DESC], ...)[USING index_type];

其中:

  • UNIQUE:表示创建唯一索引,索引列的值必须唯一,不允许重复。
  • FULLTEXT:表示创建全文索引,适用于对文本类型的列进行全文搜索。
  • SPATIAL:表示创建空间索引,用于空间数据类型的列。
  • index_name:指定索引的名称。
  • table_name:指定要在哪个表上创建索引。
  • (column1, column2, …):指定要在哪些列上创建索引,可以是一个或多个列。
  • length:可选参数,指定索引的前缀长度。
  • ASC|DESC:可选参数,表示升序或降序排序,默认为升序。
  • USING index_type:可选参数,指定索引的类型,常见的有 BTREE、HASH 等。

例如,要在 users 表的 name 列上创建一个普通的索引,可以使用以下语句:

CREATE INDEX idx_name ON users (name);

要在 products 表的 price 列上创建一个唯一索引,可以使用以下语句:

CREATE UNIQUE INDEX idx_price ON products (price);

2.删除索引

在 MySQL 中,可以使用 DROP INDEX 语句删除索引。语法如下:

ALTER TABLE table_name DROP INDEX index_name;

其中:

  • table_name:指定要删除索引的表名。
  • index_name:指定要删除的索引名称。

例如,要删除名为 idx_name 的索引,可以使用以下语句:

ALTER TABLE users DROP INDEX idx_name;

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

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

相关文章

微软开源Garnet高性能缓存服务安装

Garnet介绍 Garnet是一款微软研究院基于C#开发而开源的高性能缓存服务,支持Windows、Linux多平台部署,Garnet兼容Redis服务API,在性能和使用架构上较Redis有很大提升(官方说法),并提供与Redis一样的命令操…

Rust egui(3) 增加多个tab

话说不知道咋写,要不直接上git patch吧。代码都是移植的官方demo,核心改动就是把原来的line_demo换成了plot_demo,里面实现多个ui,然后点击tab标题会切换不同的ui。 如下图,Lines和Markers两个不同的标签对应不同的ui。…

力扣HOT100 - 11. 盛最多水的容器

解题思路&#xff1a; 双指针&#xff0c;从左右两边往内侧夹逼&#xff0c;遍历后得到最大值 class Solution {public int maxArea(int[] height) {int i 0, j height.length - 1, res 0;while(i < j) {res height[i] < height[j] ? Math.max(res, (j - i) * heig…

【C++】关联式容器——map和set

1 关联式容器 STL中我们常用的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 那什么是关联式容器呢&#xff1f;它与序…

qt Qt Remote Object(QtRO)实现进程间通信

简介 Qt Remote Object简称QtRO&#xff0c;这是Qt5.9以后官方推出来的新模块&#xff0c;专门用于进程间通信&#xff08;IPC&#xff09;。是基于Socket来封装的&#xff0c;兼容LPC和RPC。LPC即Local Process Communication&#xff0c;而RPC是指Remote Process Communicat…

Camera入门基础知识

一、camera介绍 1.1 camera硬件组成 camera一般由Lens、VCM音圈马达、底座支架、Sensor、Driver IC、output interface组成。如下图: 这里面要注意的是有些摄像头模组有VCM,有些则没有,有些output interface输出的是CSI信号,有的输出的是串行信号,需要接解串器。…

全新的分布式锁,功能简单且强大

分布式锁是分布式系统中一个极为重要的工具。 目前有多种分布式锁的设计方案&#xff0c;比如借助 redis&#xff0c;mq&#xff0c;数据库&#xff0c;zookeeper 等第三方服务系统来设计分布式锁。 tldb 提供的分布式锁&#xff0c;主要是要简化这个设计的过程&#xff0c;提…

面向对象-继承-使用细节

面向对象-继承-使用细节 1、子类继承了父类所有的属性和方法&#xff0c;非私有的属性和方法可以在子类中直接访问&#xff0c;但是私有的属性和方法不能在子类中直接访问&#xff0c;要通过父类提供公共的方法去访问。 2、子类必须调用父类的构造器&#xff0c;完成对父类的初…

周报_第四十六周

周报_第四十六周 时间 2023.3.18——2023.3.24 科研进展 模型优化基本完成&#xff0c;正在做对比实验整理实验结果。 项目进展 客服系统实现固定问题自动回复功能

PCB布线中晶振电容、电源大小电容、电源电容的设计细节

嵌入式软硬件爱好者 一张手册走天下。嵌入式单片机/Linux/Openwrt/电子电路技术交流分享。//主打一个技术层面的剑走偏锋&#xff0c;直击众人重视和不重视的重点//专注基础&#xff0c;才能走的更远 晶振电容 晶振旁边的电容在电路设计中不是用于滤波的。实际上&#xff0c;…

RIP,EIGRP,OSPF的区别

1.路由协议 能否选择出最优路径 2.路由协议 是否能够完成故障切换/多久能够完成故障切换 3.路由协议 是否会占用过大硬件资源 -- RIP -- 路由信息协议 跳数:一次三层设备的转发算一跳 中间隔的设备数量 不按照链路带宽来算 Rip认为路径一样,这个时候。 下面这个跳数不…

每日一题 --- 反转链表[力扣][Go]

反转链表 题目&#xff1a;206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&a…

阿里云服务器价格购买价格表,2024新版报价查询

2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

(Linux 学习十二)文件查找和文件压缩

一.文件查找 which 命令查找 也可以用 whereis find 文件查找&#xff0c;针对文件名 locate 文件查找&#xff0c;依赖数据库alias 别名 alias yyy ls --colorauto -l yyy //相当于别名 查看文件which ls //查找ls 命令位置 whereis vim //也是查找命令locate …

Jackson 2.x 系列【2】生成器 JsonGenerator

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…

pta-洛希极限

科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时&#xff0c;大气开始被木星吸走&#xff0c;而随着不断接近地木“刚体洛希极限”&#xff0c;地球面临被彻底撕碎的危险。但实际上&#xff0c;这个计算是错误的。 洛希极限&#xff08;Roche limit&#xff09;是一…

javase day11笔记

第十一天课堂笔记 构造代码块 { } 给 所有对象 共性特点 进行初始化操作 创建对象时在堆区对象中存放实例变量,同时执行构造代码块 执行顺序:静态代码块—>非静态代码块—>构造方法 继承★★★ 将多个类中相同的实例变量和实例方法 , 单独存放到一个类中,成为父类…

基于Java中的SSM框架实现快餐店线上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现快餐店线上点餐系统演示 摘要 随着计算机互联网的高速发展。餐饮业的发展也加入了电子商务团队。各种网上点餐系统纷纷涌现&#xff0c;不仅增加了商户的销售量和营业额&#xff0c;而且为买家提供了极大的方便&#xff0c;足不出户&#xff0c;就能订…

Gomamayo Sequence

这个有意思&#xff0c;收录一下 D - Gomamayo Sequence (atcoder.jp) #include <iostream> #include <string> #include <stack> #include <vector> #include <queue> #include <deque> #include <set> #include <map> #in…

云计算安全分析

目录 一、概述 二、《云计算服务安全指南》的云安全风险分析 2.1 客户对数据和业务系统的控制能力减弱 2.2 客户与云服务商之间的责任难以界定 2.3 可能产生司法管辖权问题 2.4 数据所有权保障面临风险 2.5 数据保护更加困难 2.6 数据残留 2.7 容易产生对云服务商的过度…