文档章节

数据库中索引的理解

雷伟波
 雷伟波
发布于 2015/04/16 22:28
字数 841
阅读 9
收藏 0
点赞 0
评论 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
简单理解倒排索引

倒排索引是整个搜索系统的核心,上一篇中讨论了关系型数据库不适合做全文检索。本文讨论讨论3个问题,我们常说的文档是指什么,正排索引是什么,倒排索引是什么。 1、文档(document) 如果拿...

chloe900
2016/12/21
82
0
MySQL · 答疑解惑 · MySQL Sort 分页

背景 6.5号,小编在 Aliyun 的论坛中发现一位开发者提的一个问题,说 RDS 发现了一个超级大BUG,吓的小编一身冷汗 = =!! 赶紧来看看,背景是一个RDS用户创建了一张表,在一个都是NULL值的非索...

阿里云RDS-数据库内核组
2015/06/05
0
0
mysql的概念理解(上)

这是一篇设计mysql数据库时候的一些小结。主要是对对MYISAM和INNODB俩种引擎进行简单介绍,还有表的一些属性进行详细介绍。 MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。MyISA...

熊猫88
2016/01/21
52
2
Cassandra – 理解关键概念和数据模型

Cassandra的设计理论倾向于实现CAP原则中的AP(Availability and Partition Tolerance)——高可用性和分布式,它的分布式是基于一致性哈希环(Consistent Hash Ring)算法实现的。 面向行(...

Justina_Chen
2013/12/09
0
0
SQL Server中数据库文件的存放方式,文件和文件组

原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html SQL Server中数据库文件的存放方式,文件和文件组 写在前面:上次我关于索引的文章有几个园友发站内信问我如何...

随智阔
2015/03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
13分钟前
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部