精华内容
下载资源
问答
  • sql 表中同一个字段已经创建了单字段索引还能在字段创建组合索引吗?
  • 前言:一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段创建索引文档,给文档加权,给字段加权以及保存文档到索引器目录 一、创建索引文档 索引文档由索引字段和权重值构成,...

    前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段、创建索引文档,给字段加权以及保存文档到索引器目录

    luncene5.5.3集合jar包下载地址:http://download.csdn.net/detail/eguid_1/9677589

    一、创建索引文档

    一个索引目录可以放多个索引文档,每个索引文档多个索引字段组成,索引字段由要索引的字段名字段内容以及权重值组成

    1、构建索引字段并加权

    /**
    	 * 创建索引字段
    	 * @param boost
    	 *            -权重值
    	 * @param fieldName
    	 *            - 字段名
    	 * @param statement
    	 *            -内容
    	 * @param fieldType
    	 *            -字段存储类型
    	 * @return
    	 */
    	public Field createField(String fieldName, String statement, FieldType fieldType, Float boost) {
    		Field field = null;
    		if (fieldName != null && statement != null && fieldType != null) {
    			field = new Field(fieldName, statement, fieldType);
    			if (boost != null) {
    				field.setBoost(boost);
    			}
    		}
    		return field;
    	}
    
    	/**
    	 * 创建索引字段
    	 * 
    	 * @param fieldName
    	 * @param reader
    	 * @param type
    	 * @param boost
    	 * @return
    	 */
    	public Field createField(String fieldName, Reader reader, FieldType type, Float boost) {
    		Field field = null;
    		if (fieldName != null && reader != null) {
    			field = new Field(fieldName, reader, type);
    			if (boost != null) {
    				field.setBoost(boost);
    			}
    		}
    		return field;
    	}
    
    	/**
    	 * 创建索引字段
    	 * 
    	 * @param fieldName
    	 * @param tokenStream
    	 * @param type
    	 * @param boost
    	 * @return
    	 */
    	public Field createField(String fieldName, TokenStream tokenStream, FieldType type, Float boost) {
    		Field field = null;
    		if (fieldName != null && tokenStream != null) {
    			field = new Field(fieldName, tokenStream, type);
    			if (boost != null) {
    				field.setBoost(boost);
    			}
    		}
    		return field;
    	}
    
    	/**
    	 * 创建索引字段
    	 * 
    	 * @param fieldName
    	 * @param value
    	 * @param type
    	 * @param boost
    	 * @return
    	 */
    	public Field createField(String fieldName, byte[] value, FieldType type, Float boost) {
    		return value != null ? createField(fieldName, value, 0, value.length, type, boost) : null;
    	}
    
    	/**
    	 * 创建索引字段
    	 * 
    	 * @param fieldName
    	 * @param value
    	 * @param offset
    	 * @param length
    	 * @param type
    	 * @param boost
    	 * @return
    	 */
    	public Field createField(String fieldName, byte[] value, int offset, int length, FieldType type, Float boost) {
    		Field field = null;
    		if (fieldName != null && value != null && type != null) {
    			field = new Field(fieldName, value, offset, length, type);
    			if (boost != null) {
    				field.setBoost(boost);
    			}
    		}
    		return field;
    	}


    2、创建索引文档

    /**
    	 * 创建索引文档
    	 * 
    	 * @return
    	 */
    	public Document createDocument() {
    		return new Document();
    	}

    二、添加字段到索引文档

    	/**
    	 * 把字段存放到索引文档
    	 * 
    	 * @param document
    	 * @param field
    	 * @return
    	 */
    	public Document addFiled(Document document, Field field) {
    		if (field != null) {
    			document.add(field);
    		}
    		return document;
    	}
    	/**
    	 * 批量存放字段到索引文档
    	 * @param document
    	 * @param fields
    	 * @return
    	 */
    	public Document addFiledList(Document document, Field... fields) {
    		if (fields != null && fields.length > 0) {
    			for (Field field : fields) {
    				document.add(field);
    			}
    		}
    		return document;
    	}


    三、给索引器添加索引文档

    使用上一章中的方法把生成的文档添加到索引中

    事实上我们常把索引文档根据不同分类保存到不同的索引目录,再搜索时可以根据不同索引目录进行搜索。

    例如:

    	Analyzer analyzer=createAnalyzer(false);
    	
    	Directory dir=createDirectory(null, "d:","dir","search");
    	
    	IndexWriterConfig conf=createIndexConf(analyzer, OpenMode.CREATE_OR_APPEND, false);
    	IndexWriter index=createIndex(dir, conf);
    	
    	//创建一个文档
    	Document doc=createDocument();
    	 String[] states = new String[] {"欢迎来到eguid的博客", "欢迎大家来到eguid的技术博客", "欢迎大家来到eguid的技术博客,很开心能和大家一起分享开源技术"};
    	//创建字段
    	Field[] fields=createFields("字段名", states, TextField.TYPE_STORED, 1.1f);
    	//批量增加字段到索引文档
    	addFiledList(doc, fields);
    	//把索引文档保存到索引器
    	index.addDocument(doc);
    这样就把添加了一个索引,想要搜索这个索引,那么接下来让我们创建搜索器吧

    下一章:lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.2







    展开全文
  • Mysql哪些字段适合建立索引

    万次阅读 2020-06-26 21:34:19
    6、索引应该建字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B 、复合...

    1 数据库建立索引常用的规则如下:

    1、表的主键、外键必须有索引;
    2、数据量超过300的表应该有索引;
    3、经常与其他表进行连接的表,在连接字段上应该建立索引;
    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
    5、索引应该建在选择性高的字段上;
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
    7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

    • A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
    • B 、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
    • C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
    • D、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

    8、频繁进行数据操作的表,不要建立太多的索引;
    9、删除无用的索引,避免对执行计划造成负面影响;

    以上是一些普遍的建立索引时的判断依据。
    索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。
    因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
    总的来说,小型表肯定不建索引,
    或者数据库记录在亿条数据级以上,还是建议使用非关系型数据库。
    还有些特殊字段的数据库,比如BLOB,CLOB字段肯定也不适合建索引。
    其实这个问题更感觉偏向于做软件项目的一种经验。

    2、对千万级MySQL数据库建立索引的事项及提高性能的手段

    一、注意事项:

    首先,应当考虑表空间和磁盘空间是否足够。我们知道索引也是一种数据,在建立索引的时候势必也会占用大量表空间。因此在对一大表建立索引的时候首先应当考虑的是空间容量问题。
    其次,在对建立索引的时候要对表进行加锁,因此应当注意操作在业务空闲的时候进行。

    二、性能调整方面:

    首当其冲的考虑因素便是磁盘I/O。物理上,应当尽量把索引与数据分散到不同的磁盘上(不考虑阵列的情况)。逻辑上,数据表空间与索引表空间分开。这是在建索引时应当遵守的基本准则。

    其次,我们知道,在建立索引的时候要对表进行全表的扫描工作,因此,应当考虑调大初始化参数db_file_multiblock_read_count的值。一般设置为32或更大。

    再次,建立索引除了要进行全表扫描外同时还要对数据进行大量的排序操作,因此,应当调整排序区的大小。

    9i之前,可以在session级别上加大sort_area_size的大小,比如设置为100m或者更大。

    9i以后,如果初始化参数workarea_size_policy的值为TRUE,则排序区从pga_aggregate_target里自动分配获得。

    最后,建立索引的时候,可以加上nologging选项。以减少在建立索引过程中产生的大量redo,从而提高执行的速度。

    MySql在建立索引优化时需要注意的问题

    设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率。设计MySql索引的时候有一下几点注意:

    1,创建索引

    对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

    2,复合索引

    比如有一条语句是这样的:

    select * from users where area=’beijing’ and age=22; 
    

    如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效
    率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age,
    salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀
    特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

    3,索引不会包含有NULL值的列

    只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

    4,使用短索引

    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    5,排序的索引问题

    mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

    6,like语句操作

    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%a%” 不会使用索引而like “aaa%”可以使用索引。

    7,不要在列上进行运算

    select * from users where YEAR(adddate)
    

    8,不使用NOT IN和操作

    NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id

    添加索引示例:

    CREATE INDEX IDX_AUDITSTATUS ON [shanghaiDB].[dbo].[Activity](AUDITSTATUS) WITH(ONLINE=ON)
     
    CREATE INDEX IDX_ANUMMID ON [nantongDB].[dbo].[Orders](ANUM,MID) WITH(ONLINE=ON)
     
    CREATE INDEX IDX_SiteCode ON Usercenter.[dbo].MO(SiteCode) WITH(ONLINE=ON)
     
    CREATE INDEX IDX_AccessDt ON [all].[dbo].[AccessLog](AccessDt) WITH(ONLINE=ON)
    

    Create index注意n如果是大表建立索引,切记加上ONLINE参数

    这几天在做数据库的优化,有个2亿记录的表,发现需要添加一个联合索引,结果就采用普通的create index index_name on tablename (entp_id,sell_date),结果悲剧了,把所有的DML语句都阻塞了,导致系统不能正常使用,还好是晚上10点,用户不是非常多,1个小时候,索引结束,阻塞解决;

    上网查了一下,如果加上 online参数后,就可以在线做索引,而不需要阻塞所有的DML语句,血的教训,拿出来与各位共勉,具体online与不加online区别如下:

    1. DML操作对create index 的影响。 如果在create的时候,有其他的进程在对这个index 所对应的数据进行DML操作,create会受影响:
    SQL> create table test (id number, name varchar2(20));
     
    Table created.
    

    然后重新开一个session:

    SQL> insert into test values (1,'lms');
     
    1 row created.
     
    <no commit>
     
    SQL> create index t1 on test(id);
    create index t1 on test(id)
    *
    ERROR at line 1:
    ORA-00054: resource busy and acquire with NOWAIT specified
    
    1. 加online这个参数,这个参数加上以后,除了create过程中index 保持online状态,Oracle还会在create index之前等待所有DML操作结束,然后得到DDL锁,开始create.
    SQL> create index t1 on test(id) online;
    <hold before commit>
    <after commit>
     
    SQL> commit;
     
    Commit complete.
     
    Index altered.
    

    如果不commit,上面的操作就会一直hold。

    所以以后create索引和rebuild索引的时候最好加上online。

    展开全文
  • 外键关系建立索引查询中排序字段,排序字段需要建立索引(大大提高排序的速度)频繁更新字段不适合创建索引where条件里用不到的字段创建索引创建单键/组合索引的选择问题。高并发下倾向于创建组合索引统计或分组...
     

    需要创建索引的情况

    1. 主键自动创建索引
    2. 频繁作为查询条件的字段应该创建索引
    3. 查询中与其他表关联的字段,外键关系建立索引
    4. 查询中排序字段,排序字段需要建立索引(大大提高排序的速度)
    5. 频繁更新字段不适合创建索引
    6. where条件里用不到的字段不创建索引
    7. 创建单键/组合索引的选择问题。高并发下倾向于创建组合索引
    8. 统计或分组字段需要创建索引

    不需要创建索引的情况

    1. 表记录太少不需要创建索引
    2. 经常dml(增、删、改)操作的表不需要创建创建索引
    3. 数据重复且分布平均的表字段没有必要创建索引

    索引选择性

    表字段记录数/表该字段不重复的记录数 越接近于1索引效果越好

    展开全文
  • 哪些字段适合建立索引

    千次阅读 2018-07-26 23:17:40
    经常需要进行更新操作的属性 1、表的主键、外键必须有索引;...6、索引应该建字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:...
    经常需要进行更新操作的属性
    
    1、表的主键、外键必须有索引;
    2、数据量超过300的表应该有索引;
    3、经常与其他表进行连接的表,在连接字段上应该建立索引;
    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
    5、索引应该建在选择性高的字段上;
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
    7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
    A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
    B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
    C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
    D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
    E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
    8、频繁进行数据操作的表,不要建立太多的索引;
    9、删除无用的索引,避免对执行计划造成负面影响;
    以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

    原文:https://blog.csdn.net/maliao1123/article/details/52431144

    展开全文
  • 哪些字段适合建立索引?

    千次阅读 2016-07-17 15:49:40
    哪些字段适合建立索引? 正确答案: B C D 你的答案: A B C (错误) select子句中的字段 外键字段 主键字段 where子句中的字段 添加笔记 求解答(10) 收藏 纠错
  • 1、表的主键、外键必须有索引;...6、索引应该建字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字...
  • mysql 一般在哪些字段建立索引

    千次阅读 2019-10-05 12:30:02
    这篇文章开始之前,我们需要注意一下,并不是索引越多越好,索引是一种以空间换取时间的方式,所以建立索引是要消耗一定的空间的,况且...4.经常与其他表进行连接的表的字段,应该字段上建立索引 5,经常出现...
  • 数据库的哪些字段适合添加索引

    千次阅读 2018-03-18 14:14:31
    接着一篇博文,谈一谈数据库中哪一些字段适合添加索引。1. 表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。MySQL ...
  • 实际,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引: 聚集索引(clustered index,也称聚类索引、簇集索引)和 非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。 ...
  • 如果不给它创建索引,则MySQL就会进行全局扫描,非常耗时。那么,类似邮箱地址这样的字符串,我们应该如何给它创建索引呢?这里简单介绍几种方法。 几种方法 比如我们有一张表user_info,存储了自增主键ID、邮箱地址...
  • 1. oracle8以上的版本中,可以使用以下语句进行索引名称和创建索引语句的查询。  SELECT INDEX_NAME,DBMS_METADATA.get_ddl('INDEX',INDEX_NAME,TABLE_OWNER) INDEX_DDL   FROM user_indexe
  • 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有... 6、索引应该建字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A...
  • mysql创建索引的时候指定索引长度  大部分的索引前面一部分的长度就能够有很好的区分度了。 通过减小索引长度,这样能够减小索引文件的大小,能够加快数据的insert。 CREATE INDEX index_name ON table_name ...
  • 需要重新创建索引,因为长度不同会认为是两个不同的所索引。 创建和删除索引 索引的创建可以CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引。删除索引可以利用ALTER TABLE或DROP ...
  • 1.主键自动建立唯一索引;2.频繁作为查询条件的字段应该创建索引;3.查询中与其他表有关联的...7.查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找);8.查询中统计或者分组的字段;9.表记...
  • 约束条件 作用控制如何给字段赋值 NULL | key | default | extra 是否允许赋null值 键值 默认值 额外设置  null(允许为空) not(不允许为空) key(索引类型) default(设置默认值,缺省为null) crea...
  • sql-哪些情况需要创建索引

    千次阅读 2018-08-21 23:16:01
    频繁作为查询条件的字段应该创建索引 查询中与其它表关联的字段,外键关联建立索引 频繁更新的字段不适合建索引(每次更新不单单是更新了记录还会更新索引) where条件中用不到的字段不建索引 单键/组合索引...
  • Oracle中空间字段创建索引

    千次阅读 2018-08-12 13:28:30
    //创建表 CREATE TABLE TestSpatial (  ID VARCHAR2(20) NOT NULL,  NAME VARCHAR2(100),  ADDRESS VARCHAR2(200),  TELEPHONE VARCHAR2(50),  LOCATION SDO_GEOMETRY ); //插入数据 INSERT INTO TestS...
  • PostgreSQL , 索引 , 所有字段 , 并行创建索引 , max_parallel_maintenance_workers 背景 如何快速给表的所有字段,每个字段都加上索引。 《PostgreSQL 设计优化case - 大宽表任意字段组合查询索引如何选择(btree,...
  • MySql 创建索引原则

    千次阅读 2015-12-27 15:41:12
    为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。本小节将向读者介绍一些索引的设计原则。   1.选择唯一性索引   唯一性索引的值是唯一的,可以更快速的通过该索...
  • 查询字段是否存在 查询course表中,存在lectures_count字段的记录信息 db.course.find( { “lectures.lectures_count”: { $exists: true } } ) 参数:ture或者false 使用update命令,删除单一字段 update命令 ...
  • 转载自随心2017的博客 ...你创建一个 组合索引 ( 班级, 姓名) 那么 SELECT * FROM 学生表 WHERE 班级='2010级3班' AND 姓名='张三' 将使用索引. SELECT * FROM 学生表 WHERE 班级='2010级3班' 将使用索引...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 370,247
精华内容 148,098
关键字:

在哪些字段上创建索引