联系我们

地址:深圳市龙岗区香江路江南大厦1251室
电话:0755-99871125
手机:13978975581
传真:0755-99871125
邮箱:秒速飞艇平台@admin.com

软件产业和互联网产业的迅猛发展

  MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了。为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下。

  注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。

  不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现。

  一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf Node(叶子节点) ,而且到任何一个 Leaf Node 的最短路径的长度都是完全相同的,所以我们大家都称之为 B-Tree 索引。当然,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 Innodb 存储引擎的 B-Tree 索引实际使用的存储结构实际上是 B+Tree,也就是在 B-Tree 数据结构的基础上做了很小的改造,在每一个Leaf Node 上面出了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 LeafNode 的指针信息(增加了顺序访问指针),这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。

  可能对于没有了解过索引的猿友这样看这篇文章十分吃力,这类猿友有必要先对Mysql索引有个大体的了解,可以看看另外一篇文章: 数据库查询优化——Mysql索引ticle/details/51424174看完这篇文章我们再回头看看上面的文字说明吧。

  接下来我们先看看B-树、B+树的概念。弄清楚,为什么加了索引查询速度会加快?

  3、非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

  4、每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

  B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;

  由于限制了除根结点以外的非叶子结点,至少含有M/2个儿子,确保了结点的至少利用率。

  所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;

  由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并;

  3、非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

  B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在

  1、所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

  3、非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

  如上图,是一颗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并不真实存在于数据表中。

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

  1、通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线、当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

  关于MySQL索引原理是比较枯燥的东西,大家只需要有一个感性的认识,并不需要理解得非常透彻和深入。我们回头来看看一开始我们说的慢查询,了解完索引原理之后,大家是不是有什么想法呢?先总结一下索引的几大基本原则

  1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>

  、

  3、尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录

  _unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);5、尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

  文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

  InnoDB 和大部分的存储引擎一样, 都是采用WAL 的方式进行写入数据,所有的数据都先写入到re....

  当一个项目做完的时候,如果客户突然又增加需求,增加功能,将导致你的项目周期严重拖延,成本剧烈上升,并....

  也就是说,基于CortexM3内核的芯片,它支持部分指令的非对齐访问,但非对齐访问要慢于对齐访问。即....

  假设有 5 个字符串,它们分别是:code,cook,five,file,fat。现在需要在里面多次....

  与堆栈类似,队列是另一种线性数据结构,以顺序方式存储元素。堆栈和队列之间唯一的显着区别是,队列不是使....

  本文档的主要内容详细介绍的是如何吧Mysql数据库移植到嵌入式Linux的详细资料说明。

  本文档的主要内容详细介绍的是JAVA教程之面向对象程序设计语言Java的系统环境概述主要内容包括了:....

  本书从面向对象(object-oriented)的角度来讲述数据结构的基础知识。数据结构是计算机科学....

  本书采用生动轻松的语言,深入阐述了C++语言和面向对象程序设计技术。书中设计了超过115个完整的经过....

  最近十多年来,软件产业和互联网产业的迅猛发展,给人们提供了用武之地,同时也给软件工程教育提出了巨大的....

  在演示的时候,我们搜索了“我爱你”和“我不信”,在Redis的客户端我们找出搜索次数最少的6个,然后....

  n = 2 时,f(2) = f(1) + f(0)。如果递归终止条件只有一个f(1) = 1,那 ....

  集成学习的Boosting算法通过结合多个弱学习器组成强学习器,AdaBoost算法是Boostin....

  双向链表的灵活处就是知道链表中的一个元素结构就可以向左或者向右开始遍历查找需要的元素结构。因此对于一....

  在数据挖掘中,通过挖掘最大频繁项集来代替挖掘频繁项集可以大大地提升系统的运行效率。针对现有的最大频繁....

  这里包含教材《数据结构和算法分析实用入门》第二版中所有练习的解决方案。对于大多数需要算法的问题,我已....

  本文档的主要内容详细介绍的是数据结构的各种算法实现资料的C++模板概述。

  本文档的主要内容详细介绍的是MySQL入门教程课件和笔记及函数等资料合集免费下载主要内容包括了:1.....

  本文档的主要内容详细介绍的是数据库教程之数据库的基本概念详细资料说明主要内容包括了: 1.1 基本....

  CAN 总线 种不同类型的帧(Frame)来表示和控制的: • 数据帧(Data Frame) 用来在数据传输过程中...

  使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能是MySQL....

  本书全面深入地介绍了MySQL的功能,主要内容包括MySQL、PHP、 Apache、 Perl 等....

  针对树形空间索引中多路查询及未考虑时间维索引的问题,提出一种结合时间和聚类结果的Hilbert-R树....

  整体的架构如上图所示。在Binlog实时采集方面,我们采用了阿里巴巴的开源项目Canal,负责从My....

  本文主要是总结了工作中一些常用的操作,以及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信....

  本文档的主要内容详细介绍的是数据库教程之关系数据库知识点总结的详细资料概述主要内容包括了:1 关系模....

  本章系统讲解了关系数据库的重要概念,包括关系的定义、关系模型的三要素(数据结构、关系操作和关系的完整....

  所谓的智能合约,即不智能,也非合约。我看有人还说,如果有了智能合约,就可以跟老板签一份放区块链上,如....

  备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机....

  1.学生成绩管理系统使用的数据库是MySql,需要调试程序请到main函数里修改数据库信息,否则运行....

  Hashtable的内部结构是怎么样的如何重新发明哈希表Hashtable

  哈希表Hashtable是计算机中最常见也最基本的数据结构之一,但是有的CS基础不扎实的学习者,其实....

  昨天跟一个CSDN上的朋友聊天,他说现在如果让他自己手写一个栈或者队列,估计都要写蛮久的,平时虽然都....

  C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理....

  第二种是对返回的数据进行排序,也就是通常看到的Using filesort,filesort是通过相....

  关于mysql.sock文件,搜索了一下资料:mysql.sock是用于socket连接的文件。也就....

  数据结构与算法的地位对于一个程序员来说不言而喻。今天这篇文章不是来劝你们学习数据结构与算法的,也不是....

  周立功主编的《C程序设计高级教程》除了介绍C语言的基础知识之外, 还重点讲解软件开发过程中常用的数据....

  Matlab命令的执行方式交互式命令执行方式(命令窗口) 逐条输入,逐条执行,操作简单、直观,但速....

  一个存储,可以对应多个实例,这将提高这个存储的负载能力以及高可用;多个存储可以分布在不同的机房、地域....

  在Zstack(TI的Zigbee协议栈)中,对于每个用户自己新建立的任务通常需要两个相关的处理函数....

  上图中的每种分布都包含相应的概率质量函数或概率密度函数。本文只涉及结果为单个数字的分布,所以横轴均为....

  1、文件系统阶段的数据管理有些什么缺陷?试举例说明。2、简述概念模式在数据结构中的重要地位。3、数据....

  近网上流传了一份没有答案的Linux运维面试题。趁工作之余,利用自己三年的运维经验交出了一份答卷。欢....

  本文介绍了linux下如何备份与恢复mysql数据库。数据库备份是非常重要的。如果定期做好备份,这样....

  本文档的主要内容详细介绍的是数据库教程之如何进行数据库设计内容包括了:1 数据库设计概述 ,2 数据....

  STM32F10x_3.5版固件的模块、数据结构和索引、文件列表等资料

  本文档的主要内容详细介绍的是STM32F10x_3.5版固件的模块、数据结构和索引、文件列表等资料。

  Python 是种易学而强大的编程语言 。 它包含了高效的高级数据结构 , 能够用简单而高效的方式进....

  一个程序应包括两个方面的内容:对数据的描述:数据结构(data structure)对操作的描述:算....

  在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人....

  1.数据结构是研究什么的? 2.根据数据元素间关系的不同特性,分哪几种不同的结构?本教材重点研究的....

  本文我们介绍了应对程序员面试过程中,必须掌握的几大数据结构。 几乎所有的问题都需要面试者对数据结构有深刻的理解。无论...

  使用mysql的时出现Access denied for user (us错误,请问这是为什么?如何解决?

  [table] [tr][td] 使用mysql的时候出现如下问题: ERROR 1045 (28000): Access denied for user ...

  使用mysql出现Access denied for user (us,请问如何解决?

  [table] [tr][td] 使用mysql的时候出现如下问题: ERROR 1045 (28000): Access denied for user ...

  手动failover,这种场景意味着在业务上没有启用MHA自动切换功能,当主服务器故障时,人工手动调用MHA来进行故障切换操作,...

  MySQL单实例 1. 跳过授权表登录 mysqld_safe --skip-grant-table --user=mysql & 2. 更改密码r...

  双向互为主从步骤: 1 两台机器添加一个丛机访问的账户赋予 replication slave权限 mysql

  grant replication slave on *.* to ...

  Labview和主流关系型数据库Oracle,Sql Server,Mysql,Access

  Labview和主流关系型数据库Oracle,Sql Server,Mysql,Access的连接问题 因为网上labview和数据库的操作并没有一个系...

  摘要: 性能优化是企业级应用永恒的话题,关系型数据库查询优化更是如此。在前台核心业务场景中,类 KeyValue 查询(以下简称类...

版权所有 Copyright©2006-2013 秒速飞艇平台
电话:0755-99871125   传真:0755-99871125   工厂地址:深圳市龙岗区香江路江南大厦1251室
备案号:粤ICP备21895562号