当前位置: 首页 > news >正文

sql 之 索引

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

1. 什么是索引

官方上面说索引是帮助MySQL高效获取数据的数据结构,通俗点来说,数据库索引就像是是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。

2. 索引原理

  • 数据结构:一般是 B+树(平衡树)作为其数据结构,因为B+树在插入、删除和查找操作中都具有良好的性能。也可能是使用哈希表
  • 通俗来讲,就是用空间替换时间

但是,为什么是B+树而不是B树呢?原因有两点:

  1. B树每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点能存储的key的数量很小,要保存同样多的key,就需要增加树的高度。树的高度每增加一层,查询时的磁盘I/O次数就增加一次,进而影响查询效率。而在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+树的高度。
  2. B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询。

3. 索引分类

  • 主键索引:primary key

    • 设定为主键后,数据库自动建立索引,InnoDB为聚簇索引,主键索引列值不能为空(Null)
  • 唯一索引:

    • 索引列的值必须唯一,但允许有空值(Null),但只允许有一个空值(Null)
  • 复合索引:

    • 一个索引可以包含多个列,多个列共同构成一个复合索引
  • 全文索引:

    • Full Text(MySQL5.7之前,只有MYISAM存储引擎引擎支持全文索引)
    • 全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找允许在这些索引列中插入重复值和空值。全文索引可以在Char、VarChar 上创建
  • 空间索引:

    • MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型,MySQL在空间索引这方年遵循OpenGIS几何数据模型规则
  • 前缀索引:

    • 在文本类型为char、varchar、text类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定

4. 索引的优缺点

  • 优点:
    大大提高数据查询速度。
    可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。
    通过索引列对数据进行排序,降低数据的排序成本降低了CPU的消耗。
    被索引的列会自动进行排序,包括【单例索引】和【组合索引】,只是组合索引的排序需要复杂一些。
    如果按照索引列的顺序进行排序,对order 不用语句来说,效率就会提高很多。

  • 缺点:
    索引会占据磁盘空间。
    索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改查操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。
    维护索引需要消耗数据库资源。

5. 创建索引

- 创建主键索引:#建表时,主键默认为索引
create table user(id varchar(11) primary key,name varchar(20),age int
)#查看user表中的索引
show index from user;
  • 创建单列索引:
#创建单列索引,只能包含一个字段
create index name_index on user(name);
  • 创建唯一索引:
#创建唯一索引,只能有一个列
create unique index age_index on user(age);
  • 创建符合索引:
#复合索引
create index name_age_index on user(name,age);

下次讲 sql 的优化,其中也有关于索引的操作~

http://www.lryc.cn/news/337080.html

相关文章:

  • 创建基于Node的WebSocket服务
  • Flask快速搭建文件上传服务与接口
  • AI算力报告:算力大时代,AI算力产业链全景梳理
  • 点击上传文件
  • 文件上传【2】--靶场通关
  • uniapp请求后端接口
  • 第十三章 OpenGL ES-RGB、HSV、HSL模型介绍
  • 微软卡内基梅隆大学:无外部干预,GPT4等大语言模型难以自主探索
  • 探索设计模式的魅力:简单工厂模式
  • 【数据结构】-----双链表(小白必看!!!)
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 8 篇:排序
  • 数字乡村可视化大数据-DIY拖拽式设计
  • 数据集学习
  • 【解决】npm run dev Syntax Error: TypeError: eslint.CLIEngine is not a constructor
  • Android 如何通过屏幕大小来适配不同大小的图片
  • 【面试题】细说mysql中的各种锁
  • TMS320F280049 EPWM模块--TZ子模块(6)
  • 数字乡村创新实践探索农业现代化路径:科技赋能农业产业升级、提升乡村治理效能与农民幸福感
  • linux中rpm包与deb包的区别及使用
  • Linux中安装seata
  • 预印本仓库ArXiv——防止论文录用前被别人剽窃
  • LNMP 架构
  • 谈谈Python中的单元测试和集成测试
  • 【2024】Prometheus通过node_exporter都监控了什么
  • Centos7配置秘钥实现集群免密登录
  • Android匿名共享内存(Ashmem)
  • MySOL之旅--------MySQL数据库基础( 3 )
  • 阿药陪你学Java(第零讲)
  • 华院计算参编《金融业人工智能平台技术要求》标准
  • vue3-element-admin二次开发遇到的问题总结,持续更新中