索引

 

索引的目的:提高查询效率

原理:通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。

数据结构:B+树

图解B+树与查找过程:

 

如上图,是一颗b+树,关于b+树的定义可以参见B+树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。

 

b+树的查找过程

如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

 

b+树性质

通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
aggregate_properties_by_list - 选择动态类对象的属性集合。 aggregate_proprties_by_regexp - 选择阶级属性集合到一个对象时使用正则表达式。 aggregation_info - 此函数是该函数的别名 aggregate_info()。 AMQPConnection::__construct - AMQPConnection创造的一个实例。 AMQPConnection::connect - 建立一个连接与AMQP broker。 AMQPConnection::disconnect - 关闭连接与AMQP broker。 AMQPConnection::isConnected - 确定AMQPConnection对象连接到 broker。 AMQPConnection::reconnect - 关闭任何打开连接,创建一个新的连接AMQP broker。 AMQPConnection::seHosr - 该方法将用来连接的主机的AMQP broker。 AMQPConnection::setLogin - 该方法将登陆字符串用来连接到AMQP broker。 AMQPConnection::serPassword - 这个方法会将密码设置字符串用来连接到AMQP broker。 AMQPConnection::setPort - 该方法将端口用来连接到AMQP broker。 AMQPConnection::setVhost - 设置虚拟主机,连接到AMQP broker。 AMQPexchange::__construct - AMQPexchange创造一个实例. AMQPexchange::bind - 绑定目录路径 AMQPexchange::declare - 声明一个新的外连broker。 AMQPecchange::delete - 删除交换broker。 AMQPexchange::publish - 发布信息交换。 AMQPqueue::__construct - 创建一个AMQPqueue实例化对象。 AMQPqueue::ack - 接收一个消息。 AMQPqueue::bind - 绑定一个元素给指定的键值。 AMQPqueue::cancel - 取消一个绑定元素。 AMQPqueue::consume - 取消目录。 AMQPqueue::declare - 声明一个新的元素broker。 AMQPqueue::delete - 删除一个元素和它的值。 AMQPqueue::get - 返回元素信息。 AMQPqueue::purge - 清除内存数据。 ANQPqueue::unbind - 切断一个交换关键值。 apache_child_terminate - 在本次请求结束后终止 apache 进程。 apache_get_modules - Get 一个目录载入 apache 模块。 apache_getenv - Get接入apache指定的环境变量。 apache_lookup_uri - 对指定的URI执行部分请求并返回所有有关信息。 apache_note - 取得或设置apache请求记录。 apache_request_headers - 读取全部HTTP 请求信息。 apache_reset_timeout - 重置apache写入时间。 apache_response_headers - 读取全部HTTP 返回信息。 apacge_setenv - 设置apache环境变量值。 apc_add - 缓存一个变量到数据存储。 apc_bin_dump - Get 一个二进制dump指定文件和变量名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值