什么是索引?(补充)

什么是索引?

索引是一种算法(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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值