MySQL——适合不适合创建索引的情况

那些情况适合创建索引

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

索引本身可以起到约束的作用,比如唯一索引、主键索引都是可以起到唯一性约束的,因此在我们的数据表中,如果某个字段是唯一性的,就可以直接创建唯一性索引,或者主键索引。这样可以更快速地通过该索引来确定某条记录。

例如,学生表中学号是具有唯一性的字段,为该字段建立唯一性索引可以很快确定某个学生的信息,如果使用姓名的话,可能存在同名现象,从而降低查询速度。

  • 业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。(来源:Alibaba)
  • 说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的。
2、频繁作为WHERE查询条件的字段

某个字段在SELECT语句的WHERE条件中经常被使用到,那么就需要给这个字段建立索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。

3、经常GROUP BY 和 ORDER BY 的列

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

4、UPDATE、DELETE的WHERE条件列
5、DISTINCT字段需要创建索引
6、多表 JOIN连接操作时,创建索引注意事项

首先,连接表的数据尽量不要超过3张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。

其次,对WHERE条件创建索引,因为WHERE才是对数据条件的过滤。如果在数据量非常打的情况下,没有WHERE条件过滤是非常可怕的。

最后,对用于连接的字段创建索引,并且该字段在多张表的类型必须一致。比如course_id在student_info表和course表都为int(11)类型,而不能一个为int另外一个为varchar类型。

7、使用类型小的创建索引

我们这里所说的类型大小指的就是该类型表示的数据范围大小。

我们在定义表结构的时候要显式的指定列的类型,以整数类型为例,有TINYINT、MEDIUMINT、INT、BIGINT等,它们占用的资源空间的依次递增,能表示的整数范围当然也是依次递增。如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用MEDIUMINT就不要使用INT。这是因为:

  • 数据类型小,在查询时进行的比较操作越快
  • 数据类型越小,索引占用的存储空间就越小,在一个数据页内就可以放下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。

这个建议对于表的主键来说更加适用,因为不仅是聚簇索引会存储主键值,其他所有的二级索引的节点处都会存储一份记录的主键值,如果主键使用更小的数据类型,也就意味着节省更多的存储空间和更高效的I/O。

8、使用字符串前缀创建索引
9、区分度高(散列性高)的列适合作为索引
10、使用最频繁的列放到联合索引的左侧

这样也可以较少的建立一些索引。同时,由于最左前缀原则,可以增加联合索引的使用率。

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

限制索引的数目

在实际工作中,我们也需要注意平衡,索引的数目不是越多越好。我们需要限制每张表上的索引数量,建议单表索引数量不超过6个。原因:

  • 每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间越大。
  • 索引会影响INSERT、DELETE、UPDATE等语句的性能,因为表中的数据更改的同时,索引也会进行调整和更新,会造成负担。
  • 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,会增加MySQL优化器生成执行计划时间,降低查询性能。

那些情况不适合创建索引

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

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

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

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

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

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

举例1:要在100万行数据中查找其中的50万行(比如性别为男的数据),一旦建立了索引,你需要先访问50万次索引,然后再访问50万次数据表,这样加起来的开销比不使用索引可能还要大。

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

频繁更新的字段不一定要创建索引,因为更新数据的时候,也需要更新索引,如果索引太多,在更新索引的时候也会造成负担,从而影响效率。

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

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

6、删除不再使用或者很少使用索引
7、不要定义冗余或重复的索引
1、冗余索引

有时候有意或无意的就对同一个列创建了多个索引,比如:index(a,b,c)相当于index(a),index(a,b),index(a,b,c)

我们知道,通过index(a,b,c)索引就可以对a列进行快速搜索,再创建一个专门针对a列的索引就算一个冗余索引,维护这个索引只会增加维护的成本,并不会对搜索有什么好处。

2、重复索引

比如学生表id即使主键,又给它定义为一个唯一索引,还给它定义一个普通索引,可是主键本身就是聚簇索引,所以定义唯一索引和普通索引是重复的,这种情况要避免。

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

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

相关文章

Nodejs 爬虫 案例

1.安装: npm install cheerio npm install axios2.介绍: 2.1 cheerio 特点和用途描述: HTML解析和操作:Cheerio 可以将 HTML 字符串加载到内存中,并将其转换为一个可操作的 DOM 树结构,从而可以方便地对…

AURIX TC3xx单片机介绍-启动过程介绍1

从各个域控制器硬件解决方案来看,MPU可能来自多个供应商,有瑞萨,有NXP等,但对于MCU来说,基本都采用英飞凌TC3xx。 今天我们就来看一下TC3xx的启动过程,主要包含如下内容: uC上电过程中,会经过一个上电时序,从复位状态“脱离”出来;Boot Firmware是复位后第一个执行的…

使用 Effect 同步-09

有些组件需要与外部系统同步。例如,你可能希望根据 React state 控制非 React 组件、设置服务器连接或在组件出现在屏幕上时发送分析日志。Effects 会在渲染后运行一些代码,以便可以将组件与 React 之外的某些系统同步。 简单理解,就是需要操…

Python实现对Word文档内容出现“重复标题”进行自动去重(4)

前言 本文是该专栏的第4篇,后面会持续分享Python办公自动化干货知识,记得关注。 在本专栏上一篇文章《Python实现对Word文档内容出现“重复标题”进行自动去重(3)》中,笔者有详细介绍使用python对word文档内容的目标文本进行自动去重。只不过本文要介绍的“去重方法”与上…

计算机专业必考之计算机指令设计格式

计算机指令设计格式 例题: 1.设相对寻址的转移指令占3个字节,第一字节为操作码,第二,第三字节为相对偏移量, 数据在存储器以低地址为字地址的存放方式。 每当CPU从存储器取出一个字节时候,自动完成&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.1,2 SPI驱动实验-SPI协议介绍

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

计算机组成原理易混淆知识点总结(持续更新)

目录 1.机器字长,存储字长与指令字长 2.指令周期,机器周期,时钟周期 3.CPI,IPS,MIPS 4.翻译程序和汇编程序 5.计算机体系结构和计算机组成的区别和联系 6.基准程序执行得越快说明机器的性能越好吗? 1.机器字长,存储字长与指令字长 不同的机器三者…

AI智能体|扣子Coze文生图功能接入微信公众号

大家好,我是无界生长。 AI智能体|扣子Coze文生图功能接入微信公众号本文分享了如何将Coze平台的文生图功能接入微信公众号的详细操作流程,包括创建图像流、创建并配置Bot、设置提示词和开场白、调试、发布等步骤。如果看完还没学会的话&…

网页图片加载慢的求解指南

网页/图片加载慢的求解指南 一、前言与问题描述 今天刚换上华为的HUAWEI AX3 Pro New,连上WIFI后测速虽然比平时慢,但是也不算太离谱,如下图所示: 估计读者们有也和作者一样,还没意识到事情的严重性😁。 …

08Django项目--用户管理系统--查(前后端)

对应视频链接点击直达 TOC 一些朋友加我Q反馈,希望有每个阶段的完整项目代码,那从今天开始,我会上传完整的项目代码。 用户管理,简而言之就是用户的增删改查。 08项目点击下载,可直接运行(含数据库&…

PHP框架 Laravel

现在因为公司需求,需要新开一个Laravel框架的项目,毫无疑问,我又被借调过去了,最近老是被借调,有点阴郁,不过反观来看,这也是好事,又可以复习和巩固一下自己的知识点,接下…

大数据开发面试题【Spark篇】

115、Spark的任务执行流程 driver和executor,结构式一主多从模式, driver:spark的驱动节点,用于执行spark任务中的main方法,负责实际代码的执行工作;主要负责:将代码逻辑转换为任务、在executo…

编译qt5.15.2(mac/windows)的mysql驱动(附带编译好的文件)

文章目录 0 背景1 编译过程2 福利 0 背景 因为需要连接到mysql数据库,所以需要连mysql驱动。 1 编译过程 1,打开文件/Users/mac/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/sqldrivers.pro,注释掉QMAKE_USE mysql; 如…

国产【Jetson Xavier NX】——从裸机到深度学习开发环境配置

1、设置系统从固态硬盘启动 英伟达官方NX出厂是直接将SD卡(64/128G)烧录系统作为系统盘使用,国产NX出厂是将系统配置在8G内存中,在后续使用中需配置大量开发包,故将系统设置为从固态硬盘启动。 参考链接 https://blo…

vue3中使用svg图标

安装依赖 npm i vite-plugin-svg-icons -D vite.config.ts中添加配置 主要为指定svg图标存放路径以及命名方式 import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path;…

總結力學_3

參考: 陈曦<<力学讲义>>http://ithatron.phys.tsinghua.edu.cn/downloads/mechanics.pdf 10 非惯性系 10.1 匀加速平动非惯性系 10.2 定轴匀速转动非惯性系 可以更好刻劃總結力學_2的有心力運動、質點系的運動的工具! 11 线性系统 11.1 线性系统、11.2 受迫…

【深入理解Python中的装饰器】

文章目录 前言装饰器的基本概念带参数的装饰器类作为装饰器结论 前言 装饰器是Python中一个非常强大且灵活的特性&#xff0c;它允许程序员在不修改原函数代码的情况下&#xff0c;增加或修改函数的行为。装饰器本质上是一个接受函数作为参数并返回一个新函数的函数。本文将深…

点击登录按钮先检测输入框的规则检测(vue组合式)

<template><el-form :model"user" :rules"rules" ref"loginForm" label-width"auto" style"max-width: 600px"><el-form-item label"用户名" prop"name"><el-input v-model"…

【Linux-LCD 驱动】

Linux-LCD 驱动 ■ Framebuffer 简称 fb■ LCD 驱动程序编写■ 1、LCD 屏幕 IO 配置■ 2、LCD 屏幕参数节点信息修改■ 3、LCD 屏幕背光节点信息■ 4、使能 Linux logo 显示 ■ 设置 LCD 作为终端控制台■ 1、设置 uboot 中的 bootargs■ 2、修改/etc/inittab 文件 ■ LCD 背光…

ROS的noetic版本

设置 sources.list 执行下面命令&#xff0c;设置从清华源下载 ROS 软件包。 sudo sh -c echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list设置密钥 sudo apt-key adv --keyse…