文章详情:大数据技术与架构、暴走大数据 概述 全局索引是Phoenix的重要特性,合理的使用二级索引能降低查询延时,让集群资源得以充分利用。本文将讲述如何高效的设计和使用索引。 全局索引说明 全局索引的根本是通过单独的HBase表来存储数据表的索引数据。我们通过如下示例看索引数据和主表数据的关系。 索引表中的主键将会是索引列和数据表主键的组合值,include的列被存储在索引表的普通列中,其目的是让查询更加高效,只需要查询一次索引表就能够拿到数据,而不用去回查主表。其过程如下图 ? 全局索引设计 我们继续使用DATA_TABLE作为示例表,创建如下组合索引。之前我们已经提到索引表中的Row key是字典序存储的,什么样的查询适合这样的索引结构呢? 使用了ROW_TIMESTAMP特性后不能使用全局索引 对索引表适当是的使用加盐特性能提升查询写入性能,避免热点。
OceanBase 的索引有局部索引和全局索引。局部索引和全局索引的索引区别在哪里?下面通过实战例子演示如何给 OceanBase 做优化。阅读时注意以下几个优化关键参考指标。 is_global_index:表示是否已经激活全局索引。 physical_range_rows:表示读取的物理范围行,数值越小越好。 场景六:创建全局索引消灭回表 create unique index global_idx_phone on user1(phone,name) global ; explain extended select phone ,name from user1 where phone = 1592014286; 全局索引按照 phone,name 也可以消来回表。 这里内部的逻辑,局部索引要完成跨域,必须要与分区键绑定。 全局索引也可以实现 LOCAL 的场景,见场景六。笔者后续会做 OceanBase 的分布式环境。
主键选择 对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。 最后,我们再来回顾下淘宝用户订单表的设计: 上图是我的淘宝订单信息,可以看到,订单号的最后 6 位都是 308113,所以可以大概率推测出: 淘宝订单表的分片键是用户 ID; 淘宝订单表,订单表的主键包含用户 所以,在分布式数据库中,唯一索引一样要通过类似主键的 UUID 的机制实现,用全局唯一去替代局部唯一,但实际上,即便是单机的 MySQL 数据库架构,我们也推荐使用全局唯一的设计。 总结 今天介绍了非常重要的分布式数据库索引设计,内容非常干货,是分布式架构设计的重中之重,建议反复阅读,抓住本文的重点,总结来说: 分布式数据库主键设计使用有序 UUID,全局唯一; 分布式数据库唯一索引设计使用 UUID 的全局唯一设计,避免局部索引导致的唯一问题; 分布式数据库唯一索引若不是分片键,则可以在设计时保存分片信息,这样查询直接路由到一个分片即可; 对于分布式数据库中的全局表,可以采用冗余机制,在每个分片上进行保存
3 , cust_id NUMBER 4 , time_id DATE 5 ) 6 PARTITION BY RANGE (time_id) 7 此时,看到这个全局索引是UNUSABLE的状态,和我们的设想是相同的,即删除分区,会导致全局索引的失效, SQL> select table_name, index_name, status 2 ,我们从问题入手,为什么分区删除,会导致全局索引的失效? 我们换种思路,之所以全局索引的状态失效,根本问题就是索引对应的分区中数据被删除了,那么,如果不删除分区中的数据,索引结构无需任何调整,他的状态是不是就是正常的? 原因已经说了,因为分区删除时,不存在任何数据需要删除,意味着无需调整索引结构,所以全局索引的状态,就无需置为失效,这个算是对待分区删除避免全局索引失效的一种另类解决方案了。
局部索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。 6. 位图索引只能为局部分区索引。 8. 局部索引多应用于数据仓库环境中。 全局索引global index 1. 全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。 全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。 3. 全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只动,截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。 4. 全局索引多应用于oltp系统中。 5. 6. oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。 7.
二、核心概念:局部索引vs全局索引对比项局部索引(LocalIndex)全局索引(GlobalIndex)存储方式每个分区独立维护自己的索引树整个表共用一个索引树分区裁剪✅支持(扫描对应分区索引)❌不支持 ,除非必须场景:当需要全局唯一约束,且查询条件无法使用分区键时,才考虑全局索引。 五、避坑指南:分区表索引的常见陷阱陷阱①:误用全局索引导致性能下降不要为了“方便”而滥用全局索引,除非必须保证全局唯一性。优先使用局部索引。 陷阱④:高并发下全局索引的锁竞争全局索引的维护涉及跨分区锁,高并发写入场景可能导致锁等待,需优化事务设计或改用局部索引。六、总结与进阶思考分区表的索引设计是性能优化的关键! 记住以下几点:局部索引优先:兼顾分区键和查询条件,实现分区裁剪+索引加速。全局索引谨慎:仅用于必须保证全局唯一且无法通过分区键优化的场景。覆盖索引提效:减少回表,降低IO开销。
6 号算子 04.31.51.670017 开始接收下层(6 号)算子数据,并输出数据到上层算子,即再次往 ACA6 表写入数据,这里写的是全局唯一索引(结合逻辑执行计划来看,这里还涉及到 EXCHANGE .... 3.2 为啥这里写全局唯一索引慢? 反之,这里 6->3 号算子需要物化数据、向上层算子写全局唯一(非分区)索引,相当于写单分区,效率相对慢(这里虽然开了 PARALLEL_DML 并发,但由于写单分区只能用到基于数据块的并发)。 全局唯一非分区索引 全局唯一分区索引 全局普通非分区索引 全局普通分区索引 遇到 INDEX INSERT 全局非分区索引的情况,大数据量跑批场景性能可能不是很客观,对此最佳优化措施就是改为全局分区索引 本例中对 INSERT 目标表 ACA6 进行改造,将表中全局唯一非分区索引(UDX_ACA6_AAZ219)改造为全局唯一分区索引,充分利用到分区并发的优势,改造后该 INSERT ...
6.1 创建索引 (1)简单方式 PUT test { "acknowledged": true, "shards_acknowledged": true, "index": "test" } (2)索引名不能包含大些字母 PUT Test (3)重复创建 PUT test (4)指定参数 PUT blog { "settings": { "number_of_shards (1)查看指定索引的配置信息 GET blog/_settings { "blog": { "settings": { "index": { "creation_date 1515459619703", "number_of_shards": "3", "number_of_replicas": "1", "uuid": "6x9RQQ5KRoStK57T88VhmA DELETE test { "acknowledged": true } 6.4 索引的打开与关闭 (1)关闭索引 POST blog/_close { "acknowledged": true
3.1 基于Hash的索引 索引条目被hash至不同的bucket(桶)中,每个桶中存放recordKey -> (PartitionPath, FileId)的映射,桶总数量需提前定义好,并且不能更新 3.5 索引删除 可以使用特殊值,如添加一个对应null值的条目,所以在索引查找时,可以继续使用相同的并发度,但是如果返回多个值时选择最新的值,例如HFile1为Record1返回FileId1,HFile3 3.8.2 选项2-多个hash查找和桶组 第一个hash可索引到1 ~ 1000的桶(称为一个桶组),一旦达到桶组的80%时,需要选取一个新的hash,新的hash可索引到1001 ~ 2000,所以在索引查找时 考虑索引方案中的每个桶都是Hudi分区中的一个文件组(包含实际数据)。MOR数据集中的典型分区可能有一个基础文件和N个小增量文件,假设在这个索引中每个桶都有一个相似的结构。 基于上面结构也很容易读取所有在给定提交时间后的索引,在两个时间间隔内提交的索引等。 5. 总结 记录级别全局索引将极大提升Hudi的写入性能,有望在0.6.0版本释出。
—— [ 百度百科 ] 数据库索引和Lucene检索对比 比较项 Lucene检索 数据库检索 数据检索 从Lucene的索引文件中检出 由数据库索引检索记录 索引结构 Document(文档) } } catch (IOException e) { e.printStackTrace(); } } } 全局搜索索引 java.io.IOException; import java.io.StringReader; import java.nio.file.Paths; /** *
* Lucene全局搜索服务类 Directory:索引存放的位置;lucene 提供了两种索引存放的位置,一种是磁盘,一种是内存。 Document:文档;Document 相当于一个要进行索引的单元,任何可以想要被索引的文件都 必须转化为Document 对象才能进行索引。 Field:字段。
OceanBase 从索引和主表的关系来讲,有两种索引:局部索引和全局索引。 局部索引等价于我们通常说的本地索引,与主表的数据结构保持一对一的关系。 全局索引区别于局部索引,与主表数据结构保持一对多、多对多的关系,全局索引主要应用于分区表。 对于分区表来讲,一个非分区全局索引对应主表的多个分区;一个分区全局索引也对应主表的多个分区,同时主表每个分区也对应多个全局索引的索引分区。 引入全局索引的目标就是弥补局部索引在数据过滤上的一些不足,比如避免分区表的全分区扫描,把过滤条件下压到匹配的表分区中。 针对查询过滤条件来讲,局部索引和全局索引的简单使用场景总结如下: 1. 不带分区键的查询有两个考虑方向,主要在于能否克服全局索引的缺点:全局索引势必会带来查询的分布式执行! (1)表的并发写不大,可以考虑用全局索引。
6种方式创建多层索引MultiIndex pd.MultiIndex即具有多个层次的索引。通过多层次索引,我们就可以操作整个索引组的数据。 本文主要介绍在Pandas中创建多层索引的6种方式: pd.MultiIndex.from_arrays():多维数组作为参数,高维指定高层索引,低维指定低层索引。 pd.MultiIndex.from_tuples():元组的列表作为参数,每个元组指定每个索引(高维和低维索引)。 (array4) m4 Out[6]: MultiIndex([('xiaoming', 22), ( 'guanyu', 25), ('zhangfei = pd.MultiIndex.from_arrays(array6,names=["姓名","性别","年龄"]) m6 Out[8]: MultiIndex([('xiaoming', 'male
—— [ 百度百科 ] 数据库索引和Lucene检索对比 比较项Lucene检索数据库检索数据检索从Lucene的索引文件中检出由数据库索引检索记录索引结构Document(文档)Record(记录) } } catch (IOException e) { e.printStackTrace(); } } } 全局搜索索引 java.io.IOException; import java.io.StringReader; import java.nio.file.Paths; /** *
* Lucene全局搜索服务类 Directory:索引存放的位置;lucene 提供了两种索引存放的位置,一种是磁盘,一种是内存。 Document:文档;Document 相当于一个要进行索引的单元,任何可以想要被索引的文件都 必须转化为Document 对象才能进行索引。 Field:字段。
今天看到《删除分区如何不让全局索引失效?》这篇文章有朋友提了个问题, ? 官方文档,已经明确指出,除非使用update indexes,否则用truncate分区表,就会导致全局索引失效,必须重建, Unless you specify UPDATE INDEXES, any 扩展一下,对堆表来说,alter table不带update indexes,则涉及的局部索引会失效,涉及的全局索引会标记为失效,需要重建,对索引组织表,局部索引的效果和堆表相同,但是全局索引仍可用, 分区表执行drop、truncate、exchange这些DDL操作,不再是快速操作,他的时间就需要衡量了,因为会导致全局索引的失效,需要重建索引, The DROP, TRUNCATE, and EXCHANGE 创建全局索引, SQL> create index idx_01 on interval_sale(cust_id); Index created.
但是你还是有下面 2 个可选的方案: 嵌入外部页面到 Confluence 替换 Confluence 查找 嵌入外部页面到 Confluence 如果你有少量的外部页面内容需要你的 Confluence 站点进行索引 这个要求删除你 Confluence 内部索引中的所有页面,将你 Confluence 的内部索引结果替换为你自己的 crawler 前段。 https://www.cwiki.us/display/CONF6ZH/Setting+Up+Confluence+to+Index+External+Sites
2、MongoDB支持的索引类型 在MongoDB主要支持以下几种索引类型: ·单列索引 ·复合索引 ·多键索引 ·全文索引 ·地理空间索引 ·哈希索引 2.1 单列索引 在MongoDB中,每个集合都会默认创建一个唯一索引列 2.3 多键索引 如果索引字段的值为数组,MongoDB会创建数组中的每个元素的索引键(即多键索引),不需要明确指定多键型。 像上面创建的全文索引,默认的索引名称为content_text_name_text_sex_text。 ? 由于索引名称长度的限制,以及删除索引的方便,可以在创建索引给索引命令。 2.4.3 全文索引的权重 对于全文索引,索引字段的权重表示相对于全文索引中的其他索引字段的重要性。索引列的默认权重为1。 ·不能在哈希索引列或指定哈希索引唯一约束字段上创建复合索引;但是,在同一个字段上,可以创建哈希索引和非哈希索引。MongoDB会使用标量索引范围查询。
内容索引,通常也被称为查找索引,这个索引被用来在 Confluence 中支持查找。 Gliffy plugin 插件其中的一些功能也使用了索引。 基于系统性能的考虑,Confluence 不会马上将修改的内容更新到索引中。 查看内容索引概要 希望查看有关你 Confluence 站点内容的索引信息: 在屏幕的右上角单击 控制台按钮 ? ,然后选择 General Configuration 链接。 在左侧面板的 管理(Administration)下面,选择 内容索引(Content Indexing)。 屏幕截图:索引摘要 ? https://www.cwiki.us/display/CONF6ZH/Content+Index+Administration
修改你 Confluence 的索引语言将有助于你提高搜索的准确性,如果你网站使用的主要语言是除了英语以外的其他语言。 Confluence 可以支持下面语言的的内容索引: Arabic Brazilian Chinese CJK Czech Custom Japanese English (default) French German Greek Persian Russian 希望配置索引的语言: 进入 ? 在 格式和国际化设置(Formatting and International Settings)部分,选择 索引语言(Indexing Language)。 选择 保存(Save)。 https://www.cwiki.us/display/CONF6ZH/Configuring+the+Server+Base+URL
基本操作 创建索引结构 PUT lglbc_crud { "mappings": { "properties": { "age":{ "type": "integer 我们都是使用静态mapping,用了一段时间后,业务需求有变动,我们需要更新字段类型或者数据量太大,我们需要扩展分片数量,但是经过前面的学习,大家都知道,这些都是无法修改的,所以我们的解决办法通常是重建索引 ,然后将老数据给merge过去,那我们来看下ES如何实现这个功能 创建旧索引 PUT lglbc_reindex_old/_doc/1 { "name":"乐哥聊编程", "count":"10 ,指定分片2个,副本2个,name:keyword,count:long 创建新索引 PUT lglbc_reindex_new { "mappings": { "properties": source:旧索引信息 dest:目标索引信息 POST _reindex { "source": {"index": "lglbc_reindex_old"}, "dest": {"index
查看索引 Confluence 使用被称为 Lucene 的搜索引擎。如果你希望在你的 Confluence站点中查看更多有关索引的细节,你可以下载并且运行 Luke。 Luke 是一个开发和诊断工具,这个工具针对已经存在的 Lucene 索引,能够允许你对这个索引查看和修改。 View Space Activity 使用索引来对数据进行分类。如果你删除了索引文件,那已经存在的活动数据将会消失。 针对开发社区的小提示:如果你已经有了 Confluence 的源代码,你可以参考 SmartListManager 来找到内容索引的界面和列表。 https://www.cwiki.us/display/CONF6ZH/Content+Index+Administration