首页 文章 精选 留言 我的

精选列表

搜索[Agent体系],共10003篇文章
优秀的个人博客,低调大师

MySQL知识体系——索引

本文直切主题,针对InnoDB引擎描述索引及优化策略。在开始之前,需要读者了解:1)二叉查找树(包括2-3查找树、红黑树等数据结构)2)MySQL的InnoDB引擎基础知识 索引初探 要了解索引,当然要了解其数据结构。树有很多应用,流行的用法之一是包括UNIX和DOS在内的许多常用操作系统中的目录结构,二叉查找树又是Java中两种集合类TreeSet和TreeMap实现的基础。那么对于数据库,I/O是其性能瓶颈所在,减少树的深度是直接有效的,BTree和B+Tree应运而生。 BTree和B+Tree(Balance-Tree,多路搜索树,非二叉) BTree BTree是一种查找树,如同二叉查找树,红黑树等,都是为提高查找效率而产生的,BTree也是如此,可以把它看做二叉查找树的优化升级。二叉查找树的特点是每个非叶节点都最多只有两个子节点,但是当数据量非常大时,二叉查找树的深度过深,搜索算法自根节点向下搜索时,需要访问的节点也就变的相当多。如果这些节点存储在外存储器(磁盘)中,每访问一个节点,相当于就是进行了一次I/O操作,随着树高度的增加,频繁的I/O操作一定会降低查询的效率。BTree改二叉为多叉,每个节点存储更多的指针信息,以此达到减少树的深度、降低I/O操作数。 使用BTree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。 定义(对于一个m阶BTree) 根节点至少有两个子节点(除非根结点为叶节点) 每个节点有m-1个关键字,并且以升序排列 位于 m-1和m关键字的子节点的值位于 m-1和m 关键字对应的值之间 其它节点至少有m/2个子节点 特性 关键字集合分布在整棵树中; 任何一个关键字出现且只出现在一个节点中; 搜索有可能在非叶节点结束; 其搜索性能等价于在关键字全集内做一次二分查找; 自动层次控制。 B+Tree InnoDB 存储引擎在绝大多数情况下使用B+Tree建立索引,B+Tree也是关系型数据库中最为常用和有效的索引结构,但是B+Tree索引并不能找到一个给定键对应的具体值,它只能找到数据行对应的页,然后正如上一节所提到的,数据库把整个页读入到内存中,并在内存中查找具体的数据行。 定义(其定义基本与 BTree同,除了:) 所有叶节点之间都有一个链指针; 所有关键字都在叶子结点出现; 非叶子节点只存储键值信息,数据记录都存放在叶节点中。 特性 单节点可以存储更多的元素,使得查询磁盘IO次数更少,更加高效的单元素查找; 所有查询都要查找到叶子节点,查询性能稳定; 叶子节点会包含所有的关键字,以及指向数据记录的指针,并且叶子节点本身是根据关键字的大小从小到大顺序链接,范围查找性能更优。 区别 B+Tree是BTree的一种变形树,它与BTree的差异在于: B+Tree只有达到叶子结点才命中(BTree可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找; BTree树每个叶子节点都有双向指针; BTree分支节点和叶节点均保存记录的关键码和记录的指针;B+Tree分支节点只保存记录关键码的复制,无记录指针。所有记录都集中在叶节点一层,并且叶节点可以构成一维线性表,便于连续访问和范围查询。 聚集索引和辅助索引 数据库中的 B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index),它们之间的最大区别就是,聚集索引中存放着一条行记录的全部信息,而辅助索引中只包含索引列和一个用于查找对应行记录的“书签”。即在数据库的聚集索引中,叶子节点直接包含卫星数据。在辅助索引(NonClustered Index)中,叶节点带有指向卫星数据的指针。 聚集索引 InnoDB使用了聚集索引存储数据。 与非聚集索引的区别则是,聚集索引既存储了索引,也存储了行值。当一个表有一个聚集索引,它的数据是存储在索引的叶子页(leaf pages)上的。因此可以说InnoDB是基于索引的表。 当我们使用聚集索引对表中的数据进行检索时,可以直接获得聚集索引所对应的整条行记录数据所在的页,不需要进行第二次操作。 索引的建立规则 如果一个主键被定义了,那么这个主键就是作为聚集索引 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引 如果没有主键也没有合适的唯一索引,那么InnoDB内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增 辅助索引 辅助索引,也叫做非聚集索引,叶节点不包含行的全部数据。除了包含关键字外,还包含了一个标记,这个标记用来告诉InnoDB引擎从哪里可以找到与索引相对应的行数据。由于InnoDB引擎是索引组织表,因此,这个标记就是相应的行数据的聚集索引关键字。 辅助索引的存在并不影响数据在聚集索引中的组织,因此一个表可以有多个辅助索引。 使用辅助索引查找一条表记录的过程:通过辅助索引查找到对应的关键字,最后在聚集索引中使用关键字获取对应的行记录,这也是通常情况下行记录的查找方式。 使用建议 聚集索引的优先选择列 含有大量非重复值的列 使用 between,>或<返回一个范围值的列 需要经常排序的列,列顺序和最常用的排序一致 返回大量结果集的查询 经常被 join 的列 不建议的聚集索引列 修改频繁的列 低选择性的列,如性别 新增内容太过离散随机的列 规范与建议 命名规则:表名_字段名 需要加索引的字段,要在where条件中 如果where条件中是OR关系,加索引不起作用 能用小类型别用大类型字段 索引 key_len 长度过大,也会影响 SQL 性能。所以尽量不默认 null,会占用字节、索引长度。 常用的字段放在前面;选择性高的字段放在前面 对较长的字符数据类型的字段建索引,优先考虑前缀索引,如 index(url(64)) 只创建需要的索引,避免冗余索引,如:index(a,b),index(a) 使用联合索引,以避免回表,达到覆盖索引 联合索引遵循最左原则 索引不可滥用,索引会占用存储空间并且增加数据更新操作的复杂度,降低CUD(create/update/delate)效率 回表 先了解一个概念,MySQL对 WHERE 中条件的处理,根据索引使用情况分成三种:index key, index filter, table filter 1. index key 用于确定SQL查询在索引中的连续范围(起始范围+结束范围)的查询条件,被称之为Index Key。由于一个范围,至少包含一个起始与一个终止,因此Index Key也被拆分为Index First Key和Index Last Key,分别用于定位索引查找的起始,以及索引查询的终止条件。 2. index filter 在使用 index key 确定了起始范围和介绍范围之后,在此范围之内,还有一些记录不符合WHERE 条件,如果这些条件可以使用索引进行过滤,那么就是 index filter。 3. table filter WHERE 中的条件不能使用索引进行处理的,只能访问table,进行条件过滤了。 从普通索引查出主键索引,然后查询出数据的过程叫做回表。回表一次就会执行一次查询,所以避免回表是减少数据库压力、提高效率的有效手段。在InnoDB中,使用联合索引配合主键索引可以直接返回结果而不需要回表查询。 联合索引(复合索引)与前缀索引(最左原则) Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是(a,b,c),可以支持a|a,b|a,b,c3种组合进行查找,但不支持 b,c进行查找。这是最左原则的第一层意思:联合索引的多个字段中,只有当查询条件为联合索引的第一个字段时,索引才会有效。 条件 WHERE a LIKE 'perfix%'; 索引也会有效。这是最左原则的第二层意思:根据字段值最左若干个字符进行的模糊查询,索引有效。 覆盖索引 覆盖索引是对联合索引的合理利用。 比如 SELECT a, b FROM table WHERE a = 'wangnima';,如果我们已经创建了(a)或(a,b)的联合索引,那么这条语句会直接从索引返回而不会发生回表。即创建索引的字段覆盖了查询字段。 如果执行 SELECT c FROM table WHERE a = 'wangnima'; ,就会发生回表,因为我们的辅助索引树中,没有字段c的数据,需要拿到主键索引的关键字,去主键索引中回表查询。 但是需要注意的是,索引虽好不可滥用。 索引下推(Index Condition Pushdown (ICP)) 结合在 回表 概念中引出的三种索引使用情况(index key, index filter, table filter),ICP 技术,就是 index filter 技术。MySQL的架构分为服务器层和引擎层。 官方解释(https://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html) 索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化。如果没有ICP,存储引擎将遍历索引以定位基表中的行,并将它们返回到MySQL服务器,该服务器将计算基表行的where条件。在启用ICP的情况下,如果部分where条件可以通过只使用索引中的列来计算,MySQL服务器会把where条件的这部分 推入 存储引擎。然后,存储引擎通过使用索引条目来评估所推送的索引条件,并且只有在满足该条件时才从表中读取行。ICP可以减少存储引擎必须访问基本表的次数和MySQL服务器必须访问存储引擎的次数。 根据官方的指导,我们来做个验证: EXPLAIN SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%lao%' AND address LIKE '%Main Street%'; 官方解释: EXPLAIN使用“索引条件下推”时,输出显示Using index condition在Extra列中。 假设一个表包含有关人员及其地址的信息,并且该表的索引定义为INDEX (zipcode, lastname, firstname)。如果我们知道一个人的zipcode价值但不确定姓氏,我们可以这样搜索: SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%'; MySQL可以使用索引来扫描人zipcode='95054'。第二部分(lastname LIKE '%etrunia%')不能用于限制必须扫描的行数,因此如果没有Index Condition Pushdown,此查询必须为所有拥有的人检索完整的表行zipcode='95054'。 使用索引条件下推,MySQLlastname LIKE '%etrunia%'在读取整个表行之前检查该部分。这样可以避免读取与索引元组相对应的完整行,这些行匹配zipcode条件而不是lastname条件。 默认情况下启用索引条件下推。可以optimizer_switch通过设置index_condition_pushdown标志来控制系统变量: SET optimizer_switch = 'index_condition_pushdown=off'; SET optimizer_switch = 'index_condition_pushdown=on'; 实践 *注意语句中的“[ ··· ]”中括号指代变量,书写时记得去掉 普通索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式: 1. 创建索引 CREATE INDEX indexName ON mytable(username(length)); 如果不是字符类型的字段,如int,则不要指定length;如果是CHAR,VARCHAR类型,length可以不指定,也可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。 2. 修改表结构(添加索引) ALTER table tableName ADD INDEX indexName(columnName) 3. 创建表的时候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 唯一索引 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式: 1. 创建索引 CREATE UNIQUE INDEX indexName ON mytable(username(length)) 2. 修改表结构 ALTER table mytable ADD UNIQUE [indexName] (username(length)) 3. 创建表的时候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) ); 删除索引的语法 DROP INDEX [indexName] ON mytable; 总结 合理利用索引对于提升数据库的性能、减轻数据库服务器的负担是最直接有效的手段。 其实,索引的本质就是通过缩小范围、把随机事件变成顺序事件来筛选出最终结果,同时可以总是用同一种查找方式来定位数据,这样就可以兼顾高效率和稳定性。

优秀的个人博客,低调大师

大数据的体系架构

ZDNet至顶网软件频道消息:有些数据架构师早已开始应对物联网 (IoT)与智能设备私人网络合作产生的巨量数据。 集成专家 Brian Anderson 是软件和过程开发公司 Notionovus 的总经理。 他在职业生涯早期担任 Caterpillar 公司的嵌入式系统编程员。在当时,他主要负责为车间的机器人车辆网络构建应用系统。 在 Caterpillar 公司任职的 25 年里,Anderson 还担任过工程部主管、制造工程师和 6 西格玛黑带。 换句话说,在 IoT 还未普及以前,他便已开始处理数据问题。 Potential at Work 就有关架构师如何准备现有环境,才能进行 IoT 固有的海量扩充和大量集成的问题,对 Anderson 进行了咨询。 对于那些正在试图为 IoT 数据集成奠定结构化方法基础的架构师,您有何建议?Anderson:集成专业人员需着眼于四项关键过程指标 (KPI):速度、可靠性、成本和安全性。 在人们谈及良好或糟糕的集成体验时,上述四项面向客户的指标总会重复出现。 但在讨论 IoT 时,其关键的指标主要集中在安全性上。 设备归属于所有者,而所有者必定会有隐私方面的担忧。 IoT 竞争舞台的胜出者将会是那些可以提供最佳用户友好数据控件,而且能够严密锁定访问者查看内容的企业。 而失败者将会是那些暗中使用其设备所生成的数据窥探用户隐私的企业。 此外,还要寻求可以重复使用和利用现有代码库的工具。 这将减少对高度专业化人员的需求。 架构师的工作要更多地涉及全局思考以及对未来集成需求的预期,以便能够将灵活性置入其规划模型当中。 例如,如果数据架构师和数据集成专业人员忙于处理特定界面上的某个问题,则表明您是在浪费金钱,而不是在规划未来。 您如何将精益方法应用于非结构化的 IoT?Anderson:坚持使用有助于构建透明集成的工具。 以端对端可见的方式深入了解信息的价值链对于测量 KPI 至关重要。 如果致力于持续改进,便不能使用黑箱系统。 避免开发多余的应用系统以及重新创造已建立的连接点。 补丁、更新和错误修复程序为非客户选项,而且带有附加价值,所以要专注于最大程度地降低发行代码的复杂性。 由于坏数据造成的成本非常高昂,因此在软件中置入数据验证可以提高价值。 在系统及其用户生成无错误数据时,验证是唯一的非增值选项。 数据架构师如何才能使企业数据管理策略适应 IoT?Anderson:企业数据管理策略需要重新访问未来和现有数据流的存档、安全性和用例。 IoT 上所有增加的数据流都将对当前的操作产生巨大的影响。 您需要在适当的位置采用存档和数据保留策略,以最大化地利用海量增加的数据流,同时最大程度地减少数据管理系统占用空间。 原文发布时间为:2014年10月20日 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

HBase体系结构剖析

region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的Hregion。当table中的行不断增多,就会有越来越多的Hregion。 HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。 HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,HRegion由一个或者多个Store组成,每个store保存一 个columns family。每个Strore又由一个memStore和0至多个StoreFile组成。StoreFile以HFile格式保存在HDFS上。如 图: HFile的格式为: HFile分为六个部分: Data Block 段–保存表中的数据,这部分可以被压缩 Meta Block 段 (可选的)–保存用户自定义的kv对,可以被压缩。 File Info 段–Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。 Data Block Index 段–Data Block的索引。每条索引的key是被索引的block的第一条记录的key。 Meta Block Index段 (可选的)–Meta Block的索引。 Trailer– 这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。 HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO,随之而来的开销当然是需要花费cpu进行压缩和解压缩。 目标Hfile的压缩支持两种方式:Gzip,Lzo。 系统架构 Client 1. 包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如regione的位置信息。 Zookeeper 1. 保证任何时候,集群中只有一个master 2. 存贮所有Region的寻址入口。 3. 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master 4. 存储Hbase的schema,包括有哪些table,每个table有哪些column family Master 1. 为Region server分配region 2. 负责region server的负载均衡 3. 发现失效的region server并重新分配其上的region 4. GFS上的垃圾文件回收 5. 处理schema更新请求 Region Server 1.Region server维护Master分配给它的region,处理对这些region的IO请求 2.Region server负责切分在运行过程中变得过大的region 可以看到,client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低。

优秀的个人博客,低调大师

云主机的体系架构

云让自己内网硬件更稳定(硬件更透明),异地云让网络更稳定(网速更透明)。本地扩充数据层与逻辑层,租用扩充网络层 引用:http://www.kwww.cn/help/info_5447___.html 截止到2009年,大部分的云计算基础构架是由通过数据中心传送的可信赖的服务和创建在服务器上的不同层次的虚拟化技术组成的。人们可以在任何有提供网络基础设施的地方使用这些服务。“云”通常表现为对所有用户的计算需求的单一访问点。人们通常希望商业化的产品能够满足服务质量(QoS)的要求,并且一般情况下要提供服务水平协议。 开放标准对于云计算的发展是至关重要的,并且开源软件已经为众多的云计算实例提供了基础。 云的基本概念,是通过网络将庞大的计算处理程序自动分拆成无数个较小的子程序,再由多部服务器所组成的庞大系统搜索、计算分析之后将处理结果回传给用户。通过这项技术,远程的服务供应商可以在数秒之内,达成处理数以千万计甚至亿计的信息,达到和“超级电脑”同样强大性能的网络服务。它可分析DNA结构、基因图谱定序、解析癌症细胞等高级计算,例如Skype以点对点(P2P)方式来共同组成单一系统;又如Google通过MapReduce架构将数据拆成小块计算后再重组回来,而且Big Table技术完全跳脱一般数据库数据运作方式,以row设计存储又完全的配合Google自己的文件系统(Google文件系统),以帮助数据快速穿过“云”。云计算的产业三级分层:云软件、云平台、云设备。 上层分级:云软件Software as a Service (SaaS) 打破以往大厂垄断的局面,所有人都可以在上面自由挥洒创意,提供各式各样的软件服务。参与者:世界各地的软件开发者; 中层分级:云平台Platform as a Service (PaaS) 打造程序开发平台与操作系统平台,让开发人员可以通过网络撰写程序与服务,一般消费者也可以在上面运行程序。参与者:Google、微软、苹果、Yahoo!; 下层分级:云设备Infrastructure as a Service (IaaS) 将基础设备(如IT系统、数据库等)集成起来,像旅馆一样,分隔成不同的房间供企业租用。参与者:英业达、IBM、戴尔、升阳、惠普、亚马逊。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册