Mysql 索引基础介绍

news2024/11/19 15:24:34

索引基础介绍

索引是什么

MySQL官方:索引(INDEX)是帮助MySQL高效获取数据的数据结构。

面试官问,回:索引是排好序的快速查找数据结构

索引的目的在于提高查询效率,可以类比字典的目录。如果要查mysql这个这个单词,我们肯定要先定位到m字母,然后从上往下找y字母,再找剩下的sql。如果没有索引,那么可能需要a---z,这样全字典扫描,如果我想找Java开头的单词呢?如果我想找Oracle开头的单词呢???

重点:索引会影响到MySQL查找(WHERE的查询条件)和排序(ORDER BY)两大功能!

除了数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。下图是一种索引方式,

为了加快Co12的查找,可以维护一个右边所示的二又查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录,找91这条数据,只需要比较三次即可找到。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GE8CGamd-1687609486394)(assets/1687609375117-10.png)]

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。

数据表使用逻辑删除有两个好处:

  • 没有物理删除的数据后面可以给数据部门分析使用
  • 真正删除数据需要重整索引

我们平时所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种数据结构的索引之外,还有哈希索引(Hash Index)等。

索引优缺点

优势:

  • 查找:类似大学图书馆的书目索引,提高数据检索的效率,降低数据库的IO成本。
  • 排序:通过索引対数据进行排序,降低数据排序的成本,降低了CPU的消耗。

劣势:

  • 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。
  • 虽然索引大大提高了查询速度,但是同时会降低表的更新速度,例如对表频繁的进行INSERTUPDATEDELETE。因为更新表的时候,MySQL不仅要保存数据,还要更新一下索引文件。
  • 索引只是提高效率的一个因素,如果MySQL有大数据量的表,就需要花时间研究建立最优秀的索引(如根据客户的组合查询习惯来不断调整索引)。

建议:一张表建的索引最好不要超过5个!

索引分类

  • 单值索引:一个索引只包含单个列,一个表可以有多个单列索引。
  • 唯一索引:索引列的值必须唯一(如用户的身份证号),但是允许有多个空值。
  • 复合索引:一个索引包含多个字段。

索引常用命令

-- 创建索引 [UNIQUE] 可以省略,如不省略,创建的是唯一索引
-- 如果columnName(length)只写一个字段就是单值索引,写多个字段就是复合索引 
CREATE [UNIQUE] INDEX indexName ON tabName(columnName(length));

-- 删除某张表的某个索引 
DROP INDEX [indexName] ON tabName;

-- 查看索引(加上\G就可以以列的形式查看了 不加\G就是以表的形式查看)
SHOW INDEX FROM tabName \G;

表形式:

mysql> show index from article;
+---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+	
| article |          0 | PRIMARY        |            1 | id          | A         |           3 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| article |          1 | idx_article_cv |            1 | category_id | A         |           2 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| article |          1 | idx_article_cv |            2 | views       | A         |           3 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
3 rows in set (0.01 sec)

列形式:

mysql> show index from article\G;
*************************** 1. row ***************************
        Table: article
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 3
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
*************************** 2. row ***************************
        Table: article
   Non_unique: 1
     Key_name: idx_article_cv
 Seq_in_index: 1
  Column_name: category_id
    Collation: A
  Cardinality: 2
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
*************************** 3. row ***************************
        Table: article
   Non_unique: 1
     Key_name: idx_article_cv
 Seq_in_index: 2
  Column_name: views
    Collation: A
  Cardinality: 3
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
3 rows in set (0.00 sec)

使用ALTER命令来为数据表添加索引

-- 该语句添加一个主键,这意味着索引值必须是唯一的,并且不能为NULL -
ALTER TABLE tabName ADD PRIMARY KEY(column_list);

-- 该语句创建索引的键值必须是唯一的(除了NULL之外,NULL可能会出现多次) -
ALTER TABLE tabName ADD UNIQUE indexName(column_list);

-- 该语句创建普通索引,索引值可以出现多次
ALTER TABLE tabName ADD INDEX indexName(column_list);

-- 该语句指定了索引为FULLTEXT,用于全文检索 
ALTER TABLE tabName ADD FULLTEXT indexName(column_list);

Mysql索引结构

索引数据结构:

  • BTree索引。
  • Hash索引。
  • Full-text全文索引。
  • R-Tree索引。

BTree索引检索原理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uElmKyG4-1687609486395)(assets/1687609375086-9.png)]

【查找过程举例】

如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。

真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次10,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高.

哪些情况需要建索引

  • 主键自动建立主键索引(唯一 + 非空)
  • 频繁作为查询条件的字段应该创建索引(如银行系统的银行账号、电信系统的手机号)
  • 查询中与其他表关联的字段,外键关系建立索引(如员工表的部门id)
  • 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
  • 查询中统计或者分组字段(group by也和索引有关)
  • 使用单键还是组合索引,高并发场景下倾向于创建组合索引

那些情况不要建索引

  • 表记录太少
  • 经常增删改的表(更新表的时候,不但要保存数据,还要更新索引文件)
  • 频繁更新的字段不适合创建索引
  • 值包含大量重复值的字段不推荐创建索引(如性别只有两个值,不是男就是女。假如一个表有10万行记录,有一个字段A只有true和false两种值,并且每个值的分布概率大约为50%,那么对A字段建索引一般不会提高数据库的查询速度。索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99。一个索引的选择性越接近于1,这个索引的效率就越高)
  • Where条件里用不到的字段不创建索引

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

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

相关文章

13. python从入门到精通——Python操作数据库

数据库编程接口:python database API python database API概述 python database API 规范对于关系数据库的访问,Python社区已经制定出一个标准,称为Python Database API,通过这个接口使python跨不同数据库的操作代码可以更加具有…

动态内存管理(malloc,calloc,realloc)

文章目录 1.为什么存在动态内存分配 2.动态内存函数的介绍 3.常见的动态内存错误 4.几个经典的笔试题 5. C/C程序的内存开辟 文章内容 1.为什么存在动态内存分配 我们已经掌握的内存开辟方式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};/…

【javascript】闭包

通过定时器从第一个元素开始往后&#xff0c;每隔一秒输出arr数组中的一个元素。 <script>var arr [one, two, three];for(var i 0; i < arr.length; i) {setTimeout(function () {console.log(arr[i]);}, i * 1000);} </script> 但是运行过后&#xff0c;我…

使用生成 AI 实现准确的新闻摘要

shadow 这篇文章介绍了作者 Alessandro Alviani 的实践经验&#xff0c;非常有参考价值。 指令冗余&#xff0c;多步引导&#xff0c;是目前提高LLM输出质量的方法之一。 Towards Accurate Quote-Aware Summarization of News using Generative AI Alessandro Alviani generati…

电容式电动汽车路径规划问题的双级蚁群优化算法

摘要&#xff1a; 电动汽车&#xff08;EV&#xff09;技术的发展导致了一个新的车辆路由问题&#xff08;VRP&#xff09;&#xff0c;称为有容量的电动汽车路由问题&#xff08;CEVRP&#xff09;。由于充电站的数量有限&#xff0c;电动汽车的巡航范围有限&#xff0c;不仅要…

【从零开始学习JAVA | 第十九篇】初识内部类

前言&#xff1a; 内部类是类的五大成员。一个类的其他的成员分别是属性&#xff0c;方法&#xff0c;构造方法&#xff0c;代码块。本文将详细介绍什么是内部类&#xff0c;以及内部类的意义。 内部类&#xff1a; 内部类&#xff08;Inner Class&#xff09;是 Java 中的一个…

MedViT:一种用于广义医学图像分类的鲁棒Vision Transformer

文章目录 MedViT: A Robust Vision Transformer for Generalized Medical Image Classification摘要本文方法Locally Feed-Forward Network 实验实验结果 MedViT: A Robust Vision Transformer for Generalized Medical Image Classification 摘要 卷积神经网络(cnn)在现有医…

实现一个 AI 驱动的马里奥(使用双重深度 Q 网络),它可以自己玩游戏

训练玩马里奥的 RL 智能体 本教程将向您介绍深度强化学习的基础知识。 最后&#xff0c;您将实现一个 AI 驱动的马里奥&#xff08;使用双重深度 Q 网络&#xff09;&#xff0c;它可以自己玩游戏。 # !pip install gym-super-mario-bros7.3.0import torch from torch import …

STM32实现延时

在STM32单片机中&#xff0c;实现延时一般都是使用定时器&#xff0c;既可以使用Systick定时器&#xff0c;也可以使用常规的定时器。 定时器在设置了定时并开启之后&#xff0c;就会进入自主运行模式&#xff0c;其中&#xff0c;初始化设置这一阶段是由CPU执行相应指令完成的…

Spring Cloud_Spring Cloud Alibaba_00000

contents 微服务介绍版本选择创建项目创建Maven工程 说明 微服务介绍 微服务架构是一种架构模式。它提倡将单一应用程序划分成一组小的服务。服务之间相互协调、相互配合&#xff0c;为用户提供最终价值。每个服务运行在其独立的进程中&#xff0c;服务与服务间采用轻量级的通…

html通过web3JS 获取当前连接的区块链信息和账号信息

前面 我们讲了 MetaMask和ganache的配置安装 并用 MetaMask管理ganache的启动的虚拟区块链 那么 我们现在也完全可以写一个网页来做这个东西的管理 您可以先查看文章web3.js获取导入做一个导入了 web3的html文件 首先我们可以来试着 获取 自己当前是在哪个区块的 getBlockNum…

【深度学习】【分布式训练】DeepSpeed:AllReduce与ZeRO-DP

AllReduce与ZeRO-DP ​ ZeRO-DP是分布式训练工具DeepSpeed的核心功能之一&#xff0c;许多其他的分布式训练工具也会集成该方法。本文从AllReduce开始&#xff0c;随后介绍大模型训练时的主要瓶颈----显存的占用情况。在介绍完成标准数据并行(DP)后&#xff0c;结合前三部分的内…

玩游戏提示d3dx9丢失-找不到d3dx9怎么修复

相信有些朋友遇到了d3dx9丢失的情况不知道怎么解决&#xff0c;而今日小编带来的这篇文章就是讲解关于d3dx9丢失进行修复的操作内容&#xff0c;d3dx9丢失怎么解决&#xff1f;&#xff08;修复方法&#xff09;d3dx9文件是DirectX中必备文件,许多游戏需要此文件运行。 d3dx9丢…

文件系统概述

目录 概述用户空间层面1.应用程序可以直接使用内核提供的系统调用访问文件&#xff1a;2.应用程序也可以使用 glibc 库封装的标准 I/O 流函数访问文件&#xff1a; 硬件层面1.块设备2.闪存3.NVDIMM 内核空间层面 概述 在 Linux 系统中&#xff0c;一切皆文件&#xff0c;除了通…

【MySQL 】:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏&#xff0c;本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书&#xff0c;小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结&#xff1a;文末赠书 一、准备测…

直线导轨在焊接领域有什么作用?

焊接技术在现代制造业中的应用越来越广泛&#xff0c;直线导轨作为重要的传动元件&#xff0c;已经成为焊接设备中不可或缺的部分。 相对于直线轴承来说&#xff0c;直线导轨具有较高的负载能力和刚度&#xff0c;能够保证高精度的直线运动&#xff0c;滑动摩擦小&#xff0c;惯…

【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )

文章目录 一、Python 默认捕获所有类型异常1、默认捕获所有类型异常 - 无法获取异常类型2、代码实例 - 默认捕获所有类型异常 二、Python 捕获所有类型异常 - 捕获 Exception 异常1、捕获 Exception 类型异常 - 可获取异常类型2、代码实例 - 捕获 Exception 异常 一、Python 默…

管理类联考——逻辑——知识篇——形式逻辑——三、直言——haimian

直言 考点分析 直言 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量786223232 性质定义 直言命题也叫做性质命题&#xff0c;是判断事物是否具有某种性质的命题。直言命题由四部分组成&#xff1a;主项、谓项、联项、量项。 不同种类 对当关系 对…

PID控制算法:2、Derivative Kick(微分冲击)

什么是微分冲击Derivative Kick 引入微分&#xff0c;就是为了减少超调量的&#xff0c;但是根据PID的经典公式 就看微分部分 在PID刚开始时&#xff0c;误差值肯定是存在的&#xff0c;但是PID启动的瞬间&#xff0c;这个dt是很小的&#xff0c;这就导致是一个很大的值&#…

软件开发实习个人总结

软件开发实习个人总结篇1 一、实习目的 随着时代发展和社会进步&#xff0c;用人单位对游戏软件专业大学生的要求越来越高&#xff0c;对于即将毕业的游戏软件专业在校生而言&#xff0c;为了能更好的适应游戏软件专业严峻的就业形势&#xff0c;毕业后能够尽快的融入到社会&am…