索引
这两个词中都包含了一个词,索引
索引是一种为了加快数据库查询的一种数据结构,是由一系列的存储在电脑磁盘上面的索引项构成的。
通过一些标识,来进行快速的查找数据
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
正排索引
概念
正排表是以文档的ID为key,表中记录文档中每个关键字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
特点
这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;
因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。
若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。
但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。
存储演示
商品1 -> [(关键词1,出现3次,位置为1,3,5), (关键词2,出现2次,位置为2,6), (关键词4,出现1次,位置为10), …]
商品2 -> [(关键词1,出现1次,位置为1), (关键词3,出现4次,位置为2,4,7,9), …]
商品3 -> [(关键词2,出现2次,位置为1,4), (关键词4,出现3次,位置为2,7,10), …]
商品4 -> [(关键词5,出现1次,位置为1), (关键词6,出现1次,位置为2), …]
倒排索引
概念
倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,
一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。
特点
每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,
但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。
在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。
存储演示
关键词1 -> [商品1,商品2]
关键词2 -> [商品1,商品3]
关键词3 -> [商品2]
关键词4 -> [商品1,商品3]
关键词5 -> [商品4]
关键词6 -> [商品4]
总结
正排索引
一般是通过key,去找value。例如:当用户在主页上搜索关键词“SEO”时,假设只存在正向索引(forward index),那么就需要扫描索引库中的所有文档,找出所有包含关键词“SEO”的文档。
倒排索引
从词的关键字,去找文档。例如:在**搜索引擎 **中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词ID)。例如“文档1”经过分词,提取了20个关键词,每个关键词都会记录它在文档中的出现次数和出现位置。