MySql第三篇---索引的创建与设计原则

news2025/1/15 3:20:30

文章目录

  • MySql第三篇---索引的创建与设计原则
    • 索引的声明与使用
      • 索引的分类
      • 创建索引
      • 在已经存在的表上创建索引
      • 删除索引
    • 索引的设计原则
      • 哪些情况适合创建索引?
      • 限制索引的数目
      • 哪些情况不适合创建索引?
    • 小结

MySql第三篇—索引的创建与设计原则

索引的声明与使用

索引的分类

MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
1.从功能逻辑上来说,索引主要有4种,分别是普通索引,唯一索引,主键索引,全文索引。
2.按照 物理实现方式 ,索引可以分为 2 种: 聚簇索引和非聚簇索引
3.按照 作用字段个数进行划分,分成单列索引和联合索引

在这里插入图片描述

创建索引

1.创建表的时候创建索引

CREATE TABLE dept(
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(20)
);
CREATE TABLE emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20) UNIQUE,
dept_id INT,
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);

在这里插入图片描述

1. 创建普通索引
在这里插入图片描述
在这里插入图片描述

2. 创建唯一索引
在这里插入图片描述
在这里插入图片描述
3. 主键索引
在这里插入图片描述
在这里插入图片描述

4.创建单列索引

在这里插入图片描述

5.创建组合索引
在这里插入图片描述

6.创建全文索引
在这里插入图片描述
在这里插入图片描述

7. 创建空间索引
在这里插入图片描述

在已经存在的表上创建索引

在已经存在的表中创建索引可以使用ALTER TABLE语句或者CREATE INDEX语句。如下图:
在这里插入图片描述
案例如下图:
在这里插入图片描述
在这里插入图片描述

删除索引

在这里插入图片描述
案例如下图:
在这里插入图片描述

索引的设计原则

哪些情况适合创建索引?

1. 字段的数值有唯一性的限制

业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的。

2. 频繁作为 WHERE 查询条件的字段

某个字段在SELECT语句的 WHERE 条件中经常被使用到,那么就需要给这个字段创建索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。
比如student_info数据表(含100万条数据),假设我们想要查询 student_id=123110 的用户信息。

3. 经常 GROUP BY 和 ORDER BY 的列

索引就是让数据按照某种顺序进行存储或检索,因此当我们使用 GROUP BY 对数据进行分组查询,或者使用 ORDER BY 对数据进行排序的时候,就需要 对分组或者排序的字段进行索引 。如果待排序的列有多个,那么可以在这些列上建立 组合索引 。

4. UPDATE、DELETE 的 WHERE 条件列

对数据按照某个条件进行查询后再进行 UPDATE 或 DELETE 的操作,如果对 WHERE 字段创建了索引,就能大幅提升效率。原理是因为我们需要先根据 WHERE 条件列检索出来这条记录,然后再对它进行更新或删除。如果进行更新的时候,更新的字段是非索引字段,提升的效率会更明显,这是因为非索引字段更新不需要对索引进行维护。

5.DISTINCT 字段需要创建索引
在这里插入图片描述

6. 在多个字段都要创建索引的情况下,联合索引优于单值索引

7.使用最频繁的列放到联合索引的左侧
因为索引匹配的时候有一个最左匹配原则。

限制索引的数目

在实际工作中,我们也需要注意平衡,索引的数目不是越多越好。我们需要限制每张表上的索引数量,建议单张表索引数量不超过6个。原因:
① 每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
② 索引会影响INSERT、DELETE、UPDATE等语句的性能,因为表中的数据更改的同时,索引也会进行调整和更新,会造成负担。
③优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,会增加MySQL优化器生成执行计划时间,降低查询性能。

哪些情况不适合创建索引?

1. 在where中使用不到的字段,不要设置索引

WHERE条件(包括GROUP BY、ORDER BY)里用不到的字段不需要创建索引,索引的价值是快速定位,如果起不到定位的字段通常是不需要创建索引的。

2. 数据量小的表最好不要使用索引

如果表记录太少,比如少于1000个,那么是不需要创建索引的。表记录太少,是否创建索引对查询效率的影响并不大。甚至说,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。

3. 有大量重复数据的列上不要建立索引

在条件表达式中经常用到的不同值较多的列上建立索引,但字段中如果有大量重复数据,也不用创建索引。比如在学生表的"性别"字段上只有“男”与“·女"两个不同值,因此无须建立索引。如果建立索引,不但不会提高查询效率,反而会严重降低数据更新速度。

4.避免对经常更新的表创建过多的索引

第一层含义: 频繁更新的字段不一定要创建索引。因为更新数据的时候,也需要更新索引,如果索引太多,在更新索引的时候也会造成负担,从而影响效率。
第二层含义: 避免对经常更新的表创建过多的索引,并且索引中的列尽可能少。此时,虽然提高了查询速度,同时却会降低更新表的速度

5.不建议用无序的值作为索引

例如身份证、UUID(在索引比较时需要转为ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字符串等。

6.删除不再使用或者很少使用的索引

表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

小结

索引是一把双刃剑,可提高查询效率,但也会降低插入和更新的速度并占用磁盘空间。选择索引的最终目的是为了使查询的速度变快,上面给出的原则是最基本的准则,但不能拘泥于上面的准则,在以后的学习和工作中进行不断的实践,根据应用的实际情况进行分析和判断,选择最合适的索引方式。

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

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

相关文章

如何安装Ubuntu20.04(详细图文教程

目录 一.简介 二、需要资源 三、window设置 1、分区 2、启动盘制作 四、ubuntu安装 一.简介 Linux是一种自由和开放源代码的操作系统内核,被广泛应用于各种计算机系统中。它以稳定性、安全性和灵活性而闻名,并成为服务器、嵌入式设备和个人计算机…

如何用BCompare打增量包

一、基本描述 增量包:工程项目中的文件随着开发、更新、迭代过程,更新、修改了部分文件,没必要将所有的文件都更新时,只打包更新、修改了的这部分文件,这样的一个文件包称为增量包。 二、使用场景 在某个大的版本re…

ranger的只读(read)权限引起的

开发人员只要只读权限 在rang中只给了read的权限 ranger的read和select的权限区别 read 权限: read 权限允许用户读取(查看)文件或目录的内容。 具有 read 权限的用户可以查看文件的内容,读取目录中的文件列表和元数据&#xf…

你真的了解黑客吗?

前言:本文旨在介绍国内外黑客的发展历史,以及作为一名黑客所需的素质和原则 目录 一.黑客概述 二.黑客分类 三.国外黑客的历史 上世纪60年代初 上世纪80年代初 上世纪80年代末 上世纪90年代早期 上世纪90年代末期 2000年后 四.中国黑客的历史 …

【PythonRS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库,专门用于栅格数据的读写操作。它支持多种栅格数据格式,如GeoTIFF、ENVI和HDF5,为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用,如卫星遥感、地图制作等。通过RasterIO&#xff0c…

每日一题 1155. 掷骰子等于目标和的方法数(中等,动态规划,前缀和)

涉及到从 n-1 个骰子到 n 个骰子的状态转移,显然用动态规划做对于一共 i 个骰子所能投出来的数字之和为 t 的情况,我们用 dp[i][t] 表示,显然 dp[i][t] Σdp[i - 1][t - j],其中 j 从 1 到 k。所以对于每一个骰子我们需要 O(targ…

【C++心愿便利店】No.10---C++之模板

文章目录 前言一、泛型编程二、函数模板三、类模板 前言 👧个人主页:小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C 心愿便利店 🔑本章内容:函数模板、类模…

Delete `␍`eslintprettier/prettier

将CRLF改为LF 然后就消失了 除此之外,也可以修改git全局配置 git config --global core.autocrlf false

ChatGPT 入门指南:与 AI 进行愉快互动的秘诀大揭秘!

ChatGPT 入门指南:与 AI 进行愉快互动的秘诀大揭秘! 嗨!大家好,我是你们的互联网好友,今天我要给大家带来一份特别的礼物——《ChatGPT 入门指南》!是不是很期待呢?那就跟我一起来揭开与人工智能…

海外跨境商城电商源码-进出口电商平台网站-多语言多商户多货币平台

一、海外跨境商城电商源码简介 海外跨境电商已成为全球经济发展的重要推动力。而海外跨境商城电商源码则是实现全球化电商的关键工具。本文将详细介绍海外跨境商城电商源码及其相关内容。 二、如何理解海外跨境商城电商源码 海外跨境商城电商源码是指一套已经开发好并可直接应用…

windows10下pytorch环境部署留念

pytorch环境部署留念 第一步:下载安装anaconda 官网地址 (也可以到清华大学开源软件镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/) 我安装的是下面这个,一通下一步就完事儿。 第二步&#x…

【T3】畅捷通T3采购入库单单据预览,提示不能打开数据表。

【问题描述】 畅捷通T3点击采购入库单预览的时候, 提示ufdtprn窗口,不能打开数据库表SD-20230629HHTI_PurRKD。 【解决方法】 经查看提示的数据表为当前计算机名称, 删除计算机名称中横杠后,重启电脑正常。

PC连wifi,网线连接旭日X3派以共享网络

PC电脑连好wifi,找到【控制面板->网络和Internet->网络和共享中心->查看网络状态和任务->更改适配器设置】 找到WLAN,右键【属性->共享】勾上允许,然后【确定】。 现在去与PC通过网线连接好的X3派上配置: 参考&a…

MySQL MVCC机制探秘:数据一致性与并发处理的完美结合,助你成为数据库高手

一、前言 在分析 MVCC 的原理之前,我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。(注:下面没有特别说明默认 MySQL 的引擎为 InnoDB ) 1.1 数据库的并发场景 数据库并发场景有三种,分别是: 读-读…

深入了解JVM调优:解锁Java应用程序性能的秘诀

文章目录 &#x1f34a; JVM调优&#x1f389; 增大Eden 空间大小&#x1f389; 如果MinorGC 频繁&#xff0c;且容易引发 Full GC&#x1f4dd; S1 区大小 < MGC 存活的对象大小&#xff0c;对象的年龄才1岁&#x1f4dd; 相同年龄的对象所占总空间大小>s1区空间大小的一…

ChatGPT和Copilot协助Vue火速搭建博客网站

AI 对于开发人员的核心价值 网上会看到很多 AI 的应用介绍或者教程 使用 AI 聊天&#xff0c;咨询问题 —— 代替搜索引擎使用 AI 写各种的电商文案&#xff08;淘宝、小红书&#xff09;使用 AI 做一个聊天机器人 —— 这最多算猎奇、业余爱好、或者搞个套壳产品来收费 以上…

2023年中国调速器产量、销量及市场规模分析[图]

调速器行业是指生产、销售和维修各种调速器设备的行业。调速器是一种能够改变机械传动系统输出转速的装置&#xff0c;通过调整输入和输出的转速比来实现转速调节的功能。 调速器行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着工业自动化程度…

2023/10/23 mysql学习

数据库修改 show databases; 展示所有数据库 create database 数据库名; 创建数据库 create database if not exists 数据库名; 如果未创建过当前数据库名则创建 drop database 数据库名; drop database if exists 数据库名;用法和创建类似 删除数据库 use 数据库名; 跳…

C++数据结构X篇_20_选择排序(不稳定的排序)

「 选择排序 」虽然在实际应用中没有「 插入排序 」广泛&#xff0c;但它也是我们学习排序算法中必不可少的一种。「 冒泡排序 」和「 插入排序 」都是在两层嵌套循环中慢慢比较元素&#xff0c;不停的调整元素的位置。而「 选择排序 」就比较直接了&#xff0c;属于不出手则已…

C# ref用法,实现引用传递(地址传递)

前言&#xff1a; 今天这篇文章我们简单学习一下C# ref的用法&#xff0c;在看别人的代码不至于看不懂逻辑&#xff0c;虽然这是一个比较简单的知识点&#xff0c;但是还是值得我们去学习一下关于这个知识点一些概念&#xff0c;我们知道在C# 中我们的函数参数&#xff0c;一般…