数据库中索引的理解
数据库中索引的理解
雷伟波 发表于3年前
数据库中索引的理解
  • 发表于 3年前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

看到索引(index)最先能想起来,它能加快搜索速度,但坏处是需要额外的磁盘空间存储。

那么什么是索引?索引是按照多个字段进行排序的一种方式,对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值又指向与它相关的记录。这种索引的数据结构是经过排序的,因而可以对其执行二分查找。这也就解释了为什么索引能够加快搜索速度却需要额外的磁盘存储空间。

###例子分析

首先建立一张表的model

字段名 类型 空间大小

| id | Unsigned INT | 4B |

| firstName | char(50) | 50B |

| lastName | char(50) | 50B |

| Email | char(100) | 100B |

通过上面一张表来分析一下两种查询:通过id(已经进行排序的,在数据库中,主键将会被自动创建索引)和firstName(未经排序)查询。

通过id查询

假设表中总攻有5,000,000条记录,表中一条记录的所需要的空间为204个字节,MySQL数据库中,默认数据块的大小为1024个字节,因此500万的数据需要 5000000/(1024/204) ~ 1000000个数据块,因为id字段已经做个排序,因此可以采用二分法查找,只需要返回 log2 1000000 = 20 个块,再反观firstName字段,因为它未经排序,因此不能采用二分法查询而且也不能保证不出现重复字段,因此,需要进行1000000的数据块的遍历。

如果一条索引记录只包含索引字段和一个指向原始记录的指针,那么这条记录肯定要比它所指向的包含更多字段的记录更小。也就是说,索引本身占用的磁盘空间比原来的表更少,因此需要遍历的数据块数也比搜索原来的表更少。以下是firstName字段索引的模式:

| 字段名 | 类型 | 空间大小 |

| firstName | Char(50) |50 字节 |

|(记录指针) |Special |4 字节 |

注意:在MySQL中,根据表的大小,指针的大小可能是2、3、4或5字节。

对于这个拥有5 000 000条记录的示例数据库,假设每条索引记录要占用54字节磁盘空间,而且同样使用默认的数据块大小 B = 1024字节。那么索引的分块因数就是 bfr = (B/R) = 1024/54 = 18。最终这个表的索引需要占用 N = (r/bfr) = 5000000/18 = 277 778个数据块。

现在,再搜索firstName字段就可以使用索引来提高性能了。对索引使用二分查找,需要访问 log2 277778 = 18.09 = 19个数据块。再加上为找到实际记录的地址还要访问一个数据块,总共要访问 19 + 1 = 20个数据块,这与搜索未索引的表需要访问277 778个数据块相比,效率自然提高N个数量级。

但如文中开始所说,不能因为所以能够提升检索速度而在很多字段中,大量使用索引,建立的索引太多可能导致磁盘空间不足。因此,在建立索引时,一定要慎重选择正确的字段。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 4
码字总数 2113
×
雷伟波
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: