`
wwty
  • 浏览: 542938 次
  • 性别: Icon_minigender_1
  • 来自: 北京-郑州
社区版块
存档分类
最新评论

提高索引性能

阅读更多

本文内容来自ibm中国,仅供参考学习

 

利用 Lucene,在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率。当你需要索引大量的文件时,你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中。为了解决这个问题, Lucene 在内存中持有一块缓冲区。但我们如何控制 Lucene 的缓冲区呢?幸运的是,Lucene 的类 IndexWriter 提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率。

1.合并因子(mergeFactor

这个参数决定了在 Lucene 的一个索引块中可以存放多少文档以及把磁盘上的索引块合并成一个大的索引块的频率。比如,如果合并因子的值是 10,那么当内存中的文档数达到 10 的时候所有的文档都必须写到磁盘上的一个新的索引块中。并且,如果磁盘上的索引块的隔数达到 10 的话,这 10 个索引块会被合并成一个新的索引块。这个参数的默认值是 10,如果需要索引的文档数非常多的话这个值将是非常不合适的。对批处理的索引来讲,为这个参数赋一个比较大的值会得到比较好的索引效果。

2.最小合并文档数

这个参数也会影响索引的性能。它决定了内存中的文档数至少达到多少才能将它们写回磁盘。这个参数的默认值是10,如果你有足够的内存,那么将这个值尽量设的比较大一些将会显著的提高索引性能。

3.最大合并文档数

这个参数决定了一个索引块中的最大的文档数。它的默认值是 Integer.MAX_VALUE,将这个参数设置为比较大的值可以提高索引效率和检索速度,由于该参数的默认值是整型的最大值,所以我们一般不需要改动这个参数。

清单 5 列出了这个三个参数用法,清单 5 和清单 1 非常相似,除了清单 5 中会设置刚才提到的三个参数。

 

提高索引性能

/**
 * This class demonstrates how to improve the indexing performance 
 * by adjusting the parameters provided by IndexWriter.
 */
public class AdvancedTextFileIndexer  {
  public static void main(String[] args) throws Exception{
    //fileDir is the directory that contains the text files to be indexed
    File   fileDir  = new File("C:\\files_to_index");

    //indexDir is the directory that hosts Lucene's index files
    File   indexDir = new File("C:\\luceneIndex");
    Analyzer luceneAnalyzer = new StandardAnalyzer();
    File[] textFiles  = fileDir.listFiles();
    long startTime = new Date().getTime();

    int mergeFactor = 10;
    int minMergeDocs = 10;
    int maxMergeDocs = Integer.MAX_VALUE;
    IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);        
    indexWriter.mergeFactor = mergeFactor;
    indexWriter.minMergeDocs = minMergeDocs;
    indexWriter.maxMergeDocs = maxMergeDocs;

    //Add documents to the index
    for(int i = 0; i < textFiles.length; i++){
      if(textFiles[i].isFile() >> textFiles[i].getName().endsWith(".txt")){
        Reader textReader = new FileReader(textFiles[i]);
        Document document = new Document();
        document.add(Field.Text("content",textReader));
        document.add(Field.Keyword("path",textFiles[i].getPath()));
        indexWriter.addDocument(document);
      }
    }

    indexWriter.optimize();
    indexWriter.close();
    long endTime = new Date().getTime();

    System.out.println("MergeFactor: " + indexWriter.mergeFactor);
    System.out.println("MinMergeDocs: " + indexWriter.minMergeDocs);
    System.out.println("MaxMergeDocs: " + indexWriter.maxMergeDocs);
    System.out.println("Document number: " + textFiles.length);
    System.out.println("Time consumed: " + (endTime - startTime) + " milliseconds");
  }
}

 

通过这个例子,我们注意到在调整缓冲区的大小以及写磁盘的频率上面 Lucene 给我们提供了非常大的灵活性。现在我们来看一下代码中的关键语句。如下的代码首先创建了类 IndexWriter 的一个实例,然后对它的三个参数进行赋值。

int mergeFactor = 10;
int minMergeDocs = 10;
int maxMergeDocs = Integer.MAX_VALUE;
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);        
indexWriter.mergeFactor = mergeFactor;
indexWriter.minMergeDocs = minMergeDocs;
indexWriter.maxMergeDocs = maxMergeDocs;

 

下面我们来看一下这三个参数取不同的值对索引时间的影响,注意参数值的不同和索引之间的关系。我们为这个实验准备了 10000 个测试文档。表 1 显示了测试结果。

 

1:测试结果


 

 

通过表 1,你可以清楚地看到三个参数对索引时间的影响。在实践中,你会经常的改变合并因子和最小合并文档数的值来提高索引性能。只要你有足够大的内存,你可以为合并因子和最小合并文档数这两个参数赋尽量大的值以提高索引效率,另外我们一般无需更改最大合并文档数这个参数的值,因为系统已经默认将它设置成了最大。

  • 大小: 29.9 KB
分享到:
评论

相关推荐

    sql索引提高数据库性能

    索引可以极大地提高查询性能,尤其在处理大量数据时。在SQL Server 2000中引入了一种特殊类型的索引——索引视图,它是视图与索引的结合,旨在进一步提升性能。 **索引视图** 是在视图上创建的唯一群集或非群集索引...

    对SQL Server索引的探讨.pdf

    填充因子是指索引中每个页的填充程度,合理的填充因子可以减少页分裂,提高索引性能。 4. SQL Server索引的操作命令 SQL Server提供了一系列操作索引的命令,如DBCC INDEXDEFRAG用于重新组织指定表的聚集和非聚集...

    C# 集合的索引性能比较

    本篇文章将重点关注四个常见的集合类型:ArrayList、List、Hashtable和DataSet,并对它们的索引性能进行测试和对比。 首先,ArrayList是.NET Framework早期版本中的一个动态数组,它允许在运行时更改大小。虽然...

    如何优化SQL Server数据库的性能.pdf

    索引的选取性和填充因子的设置对提高索引性能至关重要,通常需要根据表中数据的更新频率来调整填充因子的大小,以减少索引分裂的发生,提高系统性能。 物理实现方面,需要确保每个表列的数据类型能够反映数据所需的...

    SQL语句性能优化

    - **索引长度**:索引字段长度应控制在合理范围内,避免使用过长字段,以提高索引性能。 - **重复性**:重复性低的字段更适合建立索引,如姓名;反之,重复性高的字段如性别则不必。 - **索引数量**:避免为所有...

    ORACLE四招提高位图索引

    其次,为了提高位图索引的性能,应尽可能将要建索引的列设置为固定长度的数据类型,如CHAR,而不是VARCHAR2。固定长度的数据类型在位图索引中能提供更好的性能。尽管可变长度的数据类型能节省存储空间,但考虑到性能...

    SqlServer性能优化高效索引指南.pdf

    提高索引的存储效率可以通过选择合适的索引类型、优化索引的结构、减少二次查找等方法来实现。减少维护的开销可以通过合适的索引数量、减少索引的更新频率、使用压缩技术等方法来实现。 索引的类型包括聚集索引和非...

    SQL2005通过视图索引提高系统性能

    ### SQL2005通过视图索引提高系统性能 #### 一、索引视图的概念 索引视图作为SQL Server 2005 Enterprise Edition的一项重要特性,旨在通过预计算并存储复杂的查询结果来提升数据库性能。索引视图本质上是一种特殊...

    提高SQL Server性能,可通过DBCC DBREINDEX重建索引

    ### 提高SQL Server性能:通过DBCC DBREINDEX重建索引 #### 一、引言 在数据库管理系统中,SQL Server作为一款广泛使用的数据库产品,其性能优化是确保应用程序高效运行的关键因素之一。其中,索引是提升查询速度的...

    数据库性能调优技术--索引调优

    1. **将索引和数据分开存放:** 将表数据和索引数据放置在不同的文件组中,可以减少I/O竞争,提高数据库的维护效率。 2. **合理使用组合索引:** 组合索引(如`(C1, C2)`)允许查询利用多个列进行筛选。例如,查询`...

    SQL Server索引视图及性能提高简介

    非群集索引可以提高对那些未在群集索引中涵盖的列的查询性能,避免全表扫描,提高查询速度。 尽管索引视图带来了很多好处,但增加的索引会带来额外的存储和维护成本。因此,在实施索引视图前,需要仔细分析工作负载...

    建立合理的索引提高SQL Server的性能

    在SQL Server中,索引是提升数据库性能的关键因素,尤其是对于联机事务处理(OLTP)系统,快速的数据查询和处理速度至关重要。...通过精心设计和维护索引,可以显著改善数据库的响应时间,从而提高整体应用系统的性能。

    通过SQL_Server_2005索引视图提高性能

    ### 通过SQL Server 2005索引视图提高性能 #### 一、什么是索引视图? 索引视图是一种特殊的视图,在SQL Server 2005 Enterprise Edition中得到了增强。传统上,视图是基于一个或多个表的虚拟表,主要用于实现数据...

    SqlServer性能优化高效索引指南

    合理的存储结构有助于提高索引页的使用效率。 二、索引的层次结构 SqlServer的索引由非叶级和叶级构成。非叶级分为根节点和中间级,叶级则是实际存储数据行的层次。索引的非叶级主要存储Key和指向下一层次页面的...

    浅析SQL Server 2000索引视图:使用索引视图提高查询性能.pdf

    索引视图在某些情况下能够显著提高数据库查询性能,尤其是在涉及大量行的联接和聚合操作时。本文将详细分析索引视图的概念、使用方法、优势、局限性以及创建索引视图时需要遵循的规则和注意事项。 首先,索引视图...

    提高Oracle性能--如何走索引.docx

    标题中的“提高Oracle性能--如何走索引”指的是在Oracle数据库管理系统中,通过优化SQL查询语句和合理使用索引来提升系统性能的技术方法。描述中提到,在应用系统上线后,随着数据量的增长,SQL语句的优化对于系统...

Global site tag (gtag.js) - Google Analytics