在不清楚数据表字段数据分布的情况下,应该创建什么类型的索引?

在讨论之前,先看看关系型数据库常见的索引类型:

1.位图索引,适用于该字段重复数据很多的情况;

2.B+树索引,适用于该字段重复数据不多的情况。

在不清楚数据表字段数据分布的情况下,应该创建什么类型的索引?个人觉得以上两种都不太适用,可以尝试使用第3类的索引:

3.倒排索引,在搜索引擎使用较多,适用于大多数的情况。

使用普通的文本文件格式存储倒排索引,格式为:

value:rowid(行标识码),字段值对应value,rowid对应该行的标识码。

要注意的是,在创建倒排索引时,倒排索引的key需要按ascii码排序。

同时,为了加快搜索的速度,为倒排索引创建索引的元数据,包括:

1.倒排索引文件的最大值和最小值。

2.倒排索引文件索引。

样例元数据如下:

[data]

min:1(该字段最小值)

max:100(该字段最大值)

[index]

1:value,offset(索引文件第1行的字段值和索引文件的偏移量)

10000:value,offset(索引文件第10000行的字段值和索引文件的偏移量)

......

n:value,offset(索引文件第n行的字段值和索引文件的偏移量)

在实际查询时,给出查询条件,通过读取索引的元数据可以很快的定位到该查询条件对应的倒排索引,再通过倒排索引查询数据。

时间: 2024-10-07 06:07:38

在不清楚数据表字段数据分布的情况下,应该创建什么类型的索引?的相关文章

tp数据表字段缓存

在维护一个tp写的项目,因为需要在产品表product中增加了一个字段status,但是不论如何就是无法给status赋值,查了资料才发现,原来是tp的数据表字段缓存在搞鬼. 在runtime>Data>_fields文件中找到对应的文件,文件名与表名同,这里是Product.php,增加status.再次尝试,立马就可以了. 在网上看到一篇讲这个问题的文章如下, 今天在应用thinkphp框架开发的程序做些二次开发修改, 其中有改动到数据结构,新增了几个字段. 调用 M(‘xxx’)->

MySQL数据表字段内容的批量修改、复制命令

复制字段里的数据命令: SQL代码 UPDATE table SET 被替换的字段名=被复制的字段名 演示如下 SQL代码 UPDATE dede_archives SET senddate=pubdate 如何手动将同一数据表内不同字段之间的内容批量转换,可以参考下面的命令: SQL代码 UPDATE table set 字段名=REPLACE(字段名,'原字符串','替换的字符串') where 已知的字段名 LIKE '%原字符串%' 应用到本文实例 SQL代码 UPDATE pw_mem

tp5.0 SHOW COLUMNS FROM 生成数据表字段缓存

TP5.0 生成数据表字段缓存 =控制台执行以下命令= 1.生成指定数据库的所有表字段缓存 php think optimize:schema --db databaseName 2.生成指定数据表的缓存 php think optimize:schema --table tableName 3.应用使用了不同的数据库连接,可以根据模块来生成,如下: php think optimize:schema --module index 生成之后关闭调试模式:就不会执行 SHOW COLUMNS FR

Mysql数据表字段的增,改,删

用 alter 命令来进行字段的增,改,删 1.使用 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:(如果数据表中只剩余一个字段则无法使用DROP来删除字段.) mysql> alter table runoob drop name; //删除runoob表中的name字段 2.使用 ALTER 命令 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型: mysql> alter table runoob add id

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的.很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了.第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒.你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对

laravel 同数据表字段比较查询和状态不正规排序

今天写群组推荐接口,要求未满的群 ( 群最大人数字段maxusers, 群人数字段affiliations_count 都在群组表中),官方,热门(普通群0 ,官方1,热门2 ) 排序的群 同表字段比较查询: ->whereRaw('affiliations_count  < maxusers') 按规定的状态排序(本例中要按1,2,0排序) ->orderByRaw("FIELD(group_level, " . implode(", ", [1

Hibernate实体类与数据表字段默认值之间的优先关系

在日常的应用开发过程中,我们一般都会使用对象关系映射来通过面向对象的编程模型来解决数据库的操作,我们生产过程当中使用较多的当属Hibernate框架了,他非常灵活,为我们提供了多种方式来实现数据层的操作与管理.通过实体类与数据表的映射,实体类对应表,属性对应字段就可以将我们想要生产的对象赋值到数据库,但是我们有时也需要查询对象,但是无论什么操作,都必须通过实体类来传递数据. 有时我们数据库有一些字段是数据库自动赋值,禁止用户通过程序修改的,如记录生成时间,那么如果你实体类按照正常情况下,你为了查

phome_enewsclass 数据表字段解释(栏目主表)

字段名 类型 解释 附加说明 classid smallint(6) 栏目ID   bclassid smallint(6) 父栏目ID   classname varchar(50) 栏目名称   sonclass text 终极栏目ID集合 父栏目下所有终极栏目ID集合,多个栏目ID用“|”隔开,例如:|1|5|8| is_zt tinyint(1)   预定义字段,暂时用不到,默认值0 lencord smallint(6) 每页显示信息数   link_num tinyint(4) 相关

phome_ecms_news 数据表字段解释(新闻系统模型-主表)

http://www.phome.net/doc/manual/extend/html/dbdoc/index.html 字段名 类型 解释 附加说明 id int(11) 信息ID   classid smallint(6) 栏目ID   onclick int(11) 点击数   newspath char(20) 存放日期目录   keyboard char(160) 关键字   keyid char(255) 相关链接信息ID集合 多个信息ID用半角逗号“,”隔开 userid int(