文档章节

数据库中索引的理解

雷伟波
 雷伟波
发布于 2015/04/16 22:28
字数 841
阅读 10
收藏 0

看到索引(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
作品 0
杭州
私信 提问
海量数据处理之数据库索引

前言:本文第一部分讨论数据库的索引及其优化,主要以sql server为例,第二部分我们从Mysql讨论它背后的数据结构和算法原理。 第一部分,数据库索引及其优化 一,什么是索引   数据库索引好...

城固如春
2016/10/17
6
0
T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能。但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的...

Zhao-Qian
2012/08/20
0
0
Elasticsearch上手——几个基本概念

Elasticsearch的说明文档中,基本概念(Basic Concepts)一节中提到了一些术语,结合实践经验,尝试重新理解一下。 Document(文档) 文档是Elasticsearch存储和建立索引的基本单位,比如一篇...

kjmeng
2017/01/26
0
0
SQLserver之视图、存储过程、触发器和游标(有点偏到了方法论)

今天数据库上课学习了三个概念,再加上之前学习的视图和索引,我决定一起做个总结。当然,此次总结只为了理清思路,不涉及具体代码。说到这个先插播个局外话,我觉得老师一句话说得挺好——大...

think道
2017/11/27
0
0
mysql中文进行全文索引支持问题

先来看看对一个字段做全文索引,作为一个数据库系统需要做哪些工作? 假设一个文章表里面包含几个字段:文章id、文章作者、文章标题、文章内容 比如,我们对文章内容这个字段artilce_content...

wangtaotao
2014/03/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

零距离接触阿里云时序时空数据库TSDB

概述 最近,Amazon新推出了完全托管的时间序列数据库Timestream,可见,各大厂商对未来时间序列数据库的重视与日俱增。 阿里云TSDB是阿里巴巴集团数据库事业部研发的一款高性能分布式时序时空...

阿里云云栖社区
15分钟前
0
0
OkHttpClient封装

import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; import java.util.TreeMap; import java.util.Map.Entry; import o......

尘叙缘
17分钟前
1
0
零距离接触阿里云时序时空数据库TSDB

概述 最近,Amazon新推出了完全托管的时间序列数据库Timestream,可见,各大厂商对未来时间序列数据库的重视与日俱增。 阿里云TSDB是阿里巴巴集团数据库事业部研发的一款高性能分布式时序时空...

阿里云官方博客
17分钟前
0
0
centos 7 nginx_install.sh

#!/bin/bashset -eprintf "============开始安装nginx\n"printf "============输入nginx下载url,按Enter默认下载1.14.2版本\n"download_url='';while truedoread down...

偶遇一只小仙女
18分钟前
0
0
数据库高并发下乐观锁的原理

在高并发下,经常需要处理SELECT之后,在业务层处理逻辑,再执行UPDATE的情况。 若两个连接并发查询同一条数据,然后在执行一些逻辑判断或业务操作后,执行UPDATE,可能出现与预期不相符的结...

hansonwong
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部