专栏首页用户4352451的专栏什么是索引?(补充)

什么是索引?(补充)

什么是索引?

索引是一种算法(B-tree,HASH等),索引也就是将数据列以某种算法的方式进行排列(如B-tree)本是通过全表查询(ALL) 而通过建立索引而使列数据变为有序的数据 而减少查询行数,也就比如一本书,目录也就是他的索引,如过没有目录你就得一页一页的翻,而通过目录可以大大减少数据检索的范围。

索引的分类

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么都是从a-z的,是具有连续性的,a后面就是b,b后面就是c, 聚集索引就是这样的,他是和表的物理排列顺序是一样的,例如有id为聚集索引,那么1后面肯定是2,2后面肯定是3,所以说这样的搜索顺序的就是聚集索引。非聚集索引就和按照部首查询是一样是,可能按照偏房查询的时候,根据偏旁‘弓’字旁,索引出两个汉字,张和弘,但是这两个其实一个在100页,一个在1000页,(这里只是举个例子),他们的索引顺序和数据库表的排列顺序是不一样的,这个样的就是非聚集索引

索引的使用 建立索引的原则

  1. 定义主键的数据列一定要建立索引。
  2. 定义有外键的数据列一定要建立索引。
  3. 对于经常查询的数据列最好建立索引。
  4. 对于需要在指定范围内的快速或频繁查询的数据列;
  5. 经常用在WHERE子句中的数据列。
  6. 经常出现在关键字order by、group by、distinct后面的字段,建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用。
  7. 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
  8. 对于定义为text、image和bit的数据类型的列不要建立索引。
  9. 对于经常存取的列避免建立索引
  10. 限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。
  11. 对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用

为什么索引会影响数据更新? 索引会提高查询速度但是对于删除或更新是会降低的,个人想的是:索引的创建不就是将数据进行一种算法的排列,比如说B-tree,当进行更新数据和删除数据的时候这个时候这个树结构也需要重新进行排列(如果是非聚集索引相对于聚集索引效率更慢(只是本人的想象 后续会继续验证。。。。。。))所以说多了异步数据重组的这一个过程所以说update 和delete效率大大降低

索引的常见模型:

哈希表是以key-value的形式存储的数据结构, 将数据通过Hash算法进行key的定位,并且将数据直接存储在value里面,但是在通过某种算法创建key的时候有可能会出现hash冲突,在数据库中解决hash冲突就是拉出一个链表出来,如果说定位到了同一位置那么就将其使用链表连接起来,在查找的时候找到了定位的同一位置,于是就去遍历此处位置的链表,找出对应的值,'hashTable是以List的形式而list中的key对应的是链表,新增的时候是比较快的,但是它的排列顺序不是有序的,所以说你要获取某个区间的值是很慢的,所以hash table是只适合等值查询,所以说在NoSQL数据库是非常适用的。 (hashTable数据结构的详解: )

有序数组:有序数组在查询区间还是等值效率都是非常高的,使用二分法查找其时间复杂度是O(logn),但是正是因为是 因为是有序数组在进行插入数据的时候数组会整体移动,则会导致插入的效率很慢。所以这种索引模型是不适合在经常变化的表中变化的,在静态表使用是很nice的

二叉搜索树: 二叉搜索树的特点 父节点大于右儿子且左儿子大于父节点,在进行排序的时后,每个节点的排序都是以key-value的形式这个时间复杂度为O(logn) 会大大减少查询的次数,(关于二叉搜索树的介绍) 由于是每个叶子结点都会是一个数据块,块之间通过链式连接,所以说当数据量大的话会出现多次IO磁盘读取数据所以会比较慢,所以有了N叉搜索树。

innoDB的索引模型B+树 在innoDB中,表根据主键顺序以索引的形式存放的,索引组织表每一个索引都在innoDB里面都对应一个B+树

  1. 主键索引: 主键索引的叶子结点存储的一整行数据
  2. 非主键索引:非主键也被称为二级索引, 叶子结点的内容为主键的值。()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 稀疏索引和稠密索引你了解吗?

    最近参加了一个面试,面试官先问了mysql的数据库的索引的底层数据接口,我回答了:平时都用的是innodb引擎,所以其底层的索引数据类型是B+树。面试官问我用没...

    居士
  • mysql 中的innoDB 引擎的B+树索引

    在优化慢接口的时候,遇到一个问题,在通过索引查询数据库表的时候根据时间区间去扫描表的时候,开始时间时表扫描的其实位置吗?或者说根据时间日期B+索引能一次性定位到...

    居士
  • 一看就会的mysql索引优化(真实案例)

    (使用的数据库:MYSQL 5.7 版本,InnoDB 引擎) 自从服务加了Skywalking后,将大部分慢接口暴露出来。于是就有了这次慢接口的优化。大概的...

    居士
  • MySQL索引知识学习笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    SmileNicky
  • 深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引)唯一索引/非唯一索引主键索引(主索引)聚集索引/非聚集索引5.组合索引(联合索引)

    1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

    desperate633
  • 稀疏索引和稠密索引你了解吗?

    最近参加了一个面试,面试官先问了mysql的数据库的索引的底层数据接口,我回答了:平时都用的是innodb引擎,所以其底层的索引数据类型是B+树。面试官问我用没...

    居士
  • Mysql索引

    Mysql官方对索引的定义为:索引(index)是帮助Mysql高效获取数据的数据结构。

    彼岸舞
  • 索引入门:顺序索引

    之前我对索引的了解基本就是主索引和二级索引,此外还经常见到一些其他概念,如聚集索引和非聚集索引,稀疏索引和密集索引等,今天系统整理一下。

    Apache IoTDB
  • 数据库中的联合索引

    用户1637228
  • linux一些基本命令与mysql索引

    在Linux中大部分的操作都是通过终端来实现的,或者直接使用命令行界面,一般使用Linux架构服务器的话,安装的都是命令行界面,不安装图形化界面的原因是因为没有...

    端碗吹水

扫码关注云+社区

领取腾讯云代金券