Mysql索引机制B+Tree

  1、问题引入
  
  有一个用户表,为了查询的效率,需要基于id去构建索引。构建索引我们需要考虑两个方面的问题,1个是查询的效率,1个是索引数据的存储问题。该表的记录需要支持百万、千万、甚至上亿的数据量,如果将索引存储到内存中,尽管内存的访问速度非常快,查询效率非常高,但是,占用内存会非常大。
  
  而且每次数据库重启后,索引数据就会丢失,需要在内存里重新构建索引。将索引存储到硬盘中,减少了内存的消耗,数据库重启,数据也不会丢失。
  
  确定了硬盘存储索引数据,接下来就需要选择合适的数据结构存储索引数据。首先我们会想到散列表,散列表查询性能很好,时间复杂度为O(1),但是如果想要快速查询id 在1~3之间的数据,散列表就不能满足了。散列表不满足要求,我们自然会想到另一种数据结构树,树的种类有很多种,到底哪种树适合基于磁盘构建索引呢?mysql采用b-tree的增强版b+tree 这种树去构建索引,这种树可以大大减少磁盘io的操作,提高查询效率。
  
  2、磁盘读写原理
  
  B-Tree是为磁盘等外存储设备设计的一种平衡查找树。因此在讲B-Tree之前先了解下磁盘的相关知识。
  
  2.1 硬盘组成:盘片(platter)、磁头(head)、磁道(track)、扇区(sector)、柱面(cylinder)。
  
  硬盘中一般会有多个盘片(platter)组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。每个磁道被划分成若干个扇区(sector),扇区是磁盘的最小组成单元,通常是512字节。
  
  系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。读取顺序从上到下,然后从外到内。
  
  2.2 磁盘读取响应时间:
  
  寻道时间:磁头从开始移动到数据所在磁道所需要的时间,寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms,一般都在10ms左右。
  
  旋转延迟:盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间,旋转延迟取决于磁盘转速。普通硬盘一般都是7200rpm,慢的5400rpm。
  
  数据传输时间:完成传输所请求的数据所需要的时间。
  
  从上面的指标来看、其实最重要的、或者说、我们最关心的应该只有两个:寻道时间;旋转延迟。为提高磁盘传输效率,软件应着重考虑减少寻道时间和延迟时间。
  
  如果一个文件存储在连续的扇区上,这样就可以减少寻道时间和旋转延迟,大大增加磁盘io读取的效率,这就是为什么大家常说随机读写速度将明显低于顺序读写。
  
  2.3 磁盘块
  
  由于扇区数目众多在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作,即块是操作系统中最小的逻辑存储单元。这样可以使操作系统忽略底层物理存储结构的设计。磁盘块是操作系统自己虚拟的概念,其大小由操作系统决定,通常一个块 = 单个扇区大小 * 2的n次方,其中n是可修改的。
  
  linux默认的块大小为4096个字节,也就是8个扇区的大小。jquery/js实现一个网页同时调用多个倒计时(最新的)
  
  最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!
  
  //js
  
  //js2
  
  var plugJs={
  
      stamp:0,
  
      tid:1,
  
      stampnow:Date.parse(new Date())/1000,//统一开始时间戳
  
      intervalTime:function(){
  
          if(plugJs.stamp > 0){
  
              var day =www.dasheng178.com Math.floor(plugJs.stamp / (60 * 60 * 24));
  
              var hour = Math.floor(plugJs.stamp / (60 * 60)) - (day * 24);
  
              var minute = Math.floor(plugJs.stamp / 60) - (day * 24 * 60) - (hour * 60);
  
              var second = Math.floor(plugJs.www.yinxionghui1.com/ stamp) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
  
              if (day <= 9) day = '0' + day;
  
              if (hour <= 9) hour = '0' + hour;
  
              if (minute <= 9) minute = '0' + minute;
  
              if (second <= 9) second = '0' + second;
  
              jQuery('.t_h_'+plugJs.tid).html(hour);
  
              jQuery('.t_m_'+plugJs.tid).html(minute);
  
              jQuery('.t_s_'+plugJs.tid).html(second);
  
              plugJs.stamp--;
  
              setTimeout('if(www.yongshi123.cn typeof(plugJs.intervalTime) www.tianshengyuLe1.cn== "function"){plugJs.intervalTime();}',1000);
  
          }
  
      },
  
      timer:function (stampend,tid){
  
          plugJs.stamp = parseInt(stampend)-parseInt(plugJs.stampnow);//剩余时间戳
  
          setTimeout('if(typeof(plugJs.intervalTime) www.shengban1.com/ == "function"){plugJs.intervalTime();}',1000);
  
      }
  
  };
  
  jQuery(document).ready(function(){
  
      var stampend = parseInt(jQuery(www.zhongxinyul2.com'.countdown_1').attr('data-time'));//灵活读取表里的结束时间戳
  
      plugJs.timer(stampend,'1');
  
  });
  
  //html 原文http://blog.csdn.net/websites/article/details/50037611
  
  <div class="time countdown_1" data-time="1449429731">
  
  <span class="t_h_1">00</span>
  
  <i class="lay_line">:</i>
  
  <span class="t_m_1">00</span>
  
  <i class="lay_line">:</i>
  
  <span class="t_s_1">00</span>
  
  </div>
  
  <div class="time countdown_2" data-time="1449456731">
  
  <span class="t_h_2">00</span>
  
  <i class="lay_line">:</i>
  
  <span class="t_m_2">00</span>
  
  <i class="lay_line">:</i>
  
  <span class="t_s_2">00</span>
  
  </div>
  
  注释:setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。

转载于:https://www.cnblogs.com/qwangxiao/p/10392429.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GLSL学习笔记

GLSL语言内置的变量&#xff0c;包括内置的顶点属性&#xff08;attribute&#xff09;、一致变量&#xff08;uniform&#xff09;、易变变量&#xff08;varying&#xff09;以及常量&#xff08;const&#xff09;&#xff0c;一方面加深印象&#xff0c;另一方面今天的文章…

redis源码之main()函数剖析

今天看了redis的源码之中的main()函数&#xff0c;将大概的流程进行梳理。 在代码中进行了相应的注释&#xff0c;便于阅读者理解&#xff1a; int main(int argc, char **argv) {struct timeval tv;int j;#ifdef REDIS_TESTif (argc 3 && !strcasecmp(argv[1], &qu…

SQL Server 文件规划 -位置规划

数据库设计中&#xff0c;文件规划是相当重要的一个环节。 这部分内容包括文件数目的规划&#xff0c;大小的规划&#xff0c;位置的规划。 本篇介绍的是文件位置的规划&#xff0c;如下图所示 1. 数据文件 有可能的情况下&#xff0c;应该区分经常更新的表与不经常更新的表。分…

const关键字

const关键字const是constant的简写&#xff0c;只要一个变量前面用const来修饰&#xff0c;就意味着该变量里的数据可以被访问&#xff0c;不能被修改。也就是说const意味着“只读”readonly规则&#xff1a;const离谁近&#xff0c;谁就不能被修改&#xff1b;const修饰一个变…

深入理解计算机系统 第十二章 并发编程

如果逻辑控制流在时间上重叠&#xff0c;那么它们就是并发的&#xff08;concurrent&#xff09; 这种常见的现象称为并发&#xff08;concurrency&#xff09;&#xff0c;出现在计算机系统的许多不同层面上。 并发不仅仅局限于内核&#xff0c;它也可以在应用程序中扮演重要角…

Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测

使用的是redis 3.2版本 test中的文件主要分为以下几个&#xff1a; 1.memtest.c 内存检测 2.redis_benchmark.c 用于redis性能测试的实现&#xff0c;后续会当做单独的一个章节进行分析 3.redis_check_aof.c 用于更新日志检查的实现。 4.redis_check_dump.c 用于本地数据库检查…

VSTS学习和迁移(1) 安装部署

要将开发环境从SVN到VFS中&#xff0c;下个月开始迁移。 先从WebCast中下载文件&#xff0c;看了安装部署部分。以下为部分截图&#xff1a; 一&#xff1a;课程内容 Team Foundation 的逻辑结构与物理结构 Team Foundation 系统要求 Team Foundation 安装实战 Team Founda…

【HNOI2013】数列

题面 题解 设\(\{a_n\}\)为差分数组&#xff0c;可以得到柿子&#xff1a;\[ \begin{aligned} ans & \sum_{a_1 1} ^ m \sum_{a_2 1} ^ m \cdots \sum_{a_{k-1} 1} ^ m (n - \sum_{i 1} ^ {k - 1} a_i) \\ & nm^{k - 1} - \sum_{a_1 1} ^ m \sum_{a_2 1} ^ m \cd…

程序员的艺术:排序算法舞蹈

1、冒泡排序&#xff1a; 2、希尔排序&#xff1a; 3、选择排序&#xff1a; 4&#xff1a;插入排序&#xff1a; 5、快速排序&#xff1a; 6、归并排序&#xff1a; 转载于:https://www.cnblogs.com/jxgxy/archive/2012/08/20/2648210.html

Redis源码分析之内存检测memtest

redis的内存检测会和机器的CPU位数有关&#xff0c;32位或64位会影响后面的一些宏定义参数。首先给出memtest中的API&#xff1a; void memtest_progress_start(char *title, int pass) /* 内存检测加载开始&#xff0c;输出开始的一些图线显示 */ void memtest_progress_end(…

Java Collections Framework - Java集合框架List,Map,Set等全面介绍之概要篇

deng 转载于:https://www.cnblogs.com/jacktu/archive/2009/05/15/1457316.html

C语言 数据结构 树和二叉树

树 1、树&#xff1a;是n节点的有限集。树是n(n>0)个节点的有限集。 n0时成为空树。 在任意一颗非空树中&#xff1a;&#xff08;1&#xff09;有且仅有一个称为根的节点&#xff1b;&#xff08;2&#xff09;当n>0时&#xff0c;其余节点可分为m(m>0)个互不相交的…

Oracle开启关闭归档日志

开启归档日志 shutdown immediate; --关闭数据库 startup mount; --打开数据库 alter database archivelog; --开启归档日志 alter database open; --开启数据库 archive log list; --查看归档日志是否开启 关闭归档日志 shutdown immediate; --关闭数据库 startup mount; …

Redis源码分析之anet网络通信的封装

anet是redis对tcp/ip网络中socket api接口的一个全面的封装&#xff0c;针对server/client端。封装的api的接口如下&#xff0c;注释了主要的接口&#xff1a; // tcp连接 int anetTcpConnect(char *err, char *addr, int port); // 非阻塞连接 int anetTcpNonBlockConnect(ch…

使用AJAX Toolkit创建新闻列表

我们很多站点上面都需要显示新闻列表&#xff0c;由标题和正文组成的。一般客户都希望实现这样的效果&#xff1a; 开始的时候只是显示标题&#xff0c;当点击标题的时候&#xff0c;再展开正文。再点击&#xff0c;又可缩回去。 这是典型的AJAX效果&#xff0c;或者说以前你也…

C语言 嵌入式 面试小知识点(一)

sizeof是C/C中的一个操作符&#xff08;operator&#xff09;&#xff0c;简单的说其作用就是返回一个对象或者类型所占的内存字节数。 与strlen的区别&#xff1a; 一、sizeof 是运算符&#xff0c;确切的说是一个编译时运算符&#xff0c;参数可以是数组、指针、类型、对象…

将数据渲染到页面的几种方式

将数据渲染到页面的几种方式&#xff1a; 1.字符串拼接&#xff1b; 2.dom回流 3.文档碎片&#xff08;文档碎片节点&#xff1a;documentFragment&#xff09; 4.模板 &#xff08;下章会详细介绍模板&#xff09;转载于:https://www.cnblogs.com/shangjun6/p/1039740…

论证是一门学问

本文的标题借用了安东尼.韦斯顿&#xff08;Anthony Weston&#xff09;的《论证是一门学问》一书的标题&#xff0c;向安东尼老爷子致敬的同时&#xff0c;也希望更多人能够真正了解“什么是论证”。 争论与论证从来都不是新鲜事物&#xff0c;作为软件行业的科技工作者&…

[翻译]SQL Server 工作集消息

Q&#xff1a;我发现有指向工作集&#xff08;SQL Server保留内存区域&#xff09;被分页出来相关的消息&#xff1a; 重要部分的 SQL 服务器进程内存已被分页。这可能导致性能下降。持续时间: 0 秒。 工作集 (KB)&#xff1a; 2484&#xff0c;已提交 (KB)&#xff1a; 48036&…

Redis源码分析之工具类util

在redis源码中的辅助工具类中&#xff0c;主要包括大小端转换、SHA算法以及util.h中对应的算法。 大小端转换&#xff1a; LittleEndian&#xff1a;低位字节数据存放于低地址&#xff0c;高位字节数据存放于高地址。 BigEndian&#xff1a;低位字节数据存放于高地址&#x…