精华内容
下载资源
问答
  • 以下是介绍SQL SERVER数据库全文索引的示例,以pubs数据库为例。需要的朋友参考下
  • Oracle的词法分析器针对 ZHS16GBK字符集的词法分析尚不够智能,只能机械地以字为单元进行匹配。对于utf8字符集的数据库有一个...本文将为大家介绍如何进行oracle全文索引设置的文档发给大家,适用于8i、9i各平台版本。
  • Oracle全文索引的查询模板功能可以对在CONTEXT索引上使用CATSEARCH语法,或者在CTXCAT索引上使用CONTAINS语法。本文将为大家介绍Oracle数据库全文索引查询模板的使用。
  • MYSQL数据库四种索引类型 ...全文索引可以在varchar、char、text类型的列上创建。可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全
  • Solr3.6用DIH组件进行MySQL数据库全文索引[参照].pdf
  • 数据库【存储】|【全文目录】节点是用于保存和管理【全文索引】的节点。全文目录通常是由同一数据库中的零个或多个数据表的全文索引构成的。需要注意的是,只能为每个数据表创建一个全文索引。因此,一旦在某个数据...
  • 出问题:1什么是全文索引,为什么要使用全文索引扩展问题--分词又是什么?2使用全文索引的工作原理是什么。问题阐述:在讲述什么是全文索引之前,我们来看这么一个场景:现在经常看到的“站内”搜索等功能。现在...

    导言:技术是为了解决实际问题的,如果脱离了实际的问题空谈技术,就象是不知道目标而学习一样,效率低且最后一头雾水。因此本文将通过抛出问题--明确目标--解决问题的方式来讲述 全文索引。

    抛出问题:

    1什么是全文索引,为什么要使用全文索引

    扩展问题--分词又是什么?

    2使用全文索引的工作原理是什么。

    问题阐述:

    在讲述什么是全文索引之前,我们来看这么一个场景:

    现在经常看到的“站内”搜索等功能。

    现在你想搜索 “恶魔法则”。那么网页上就会显示 所有和“恶魔法则”相关的数据。

    而这个搜索可以按标题,可以按内容,也可以按作者的综合搜索。如何实现呢?

    对于这个问题,一个刚学sql语句两天的朋友都会说  select * from 表名 where 标题 like '%xxx%' or 内容 like '%xxx%' or 作者 like '%xxx%';

    没错,这个语句是可以实现这种功能。但是效率却无比的低下。(什么?你问为什么?这个问题请自行思考+google)

    那么如何实现这种功能,而又能提高其效率呢?

    其中一种方式便是全文索引。

    全文索引是为了使得“关键词搜索”功能更加的高效能。

    那么什么是全文索引呢?

    我们把应用场景具体化:

    现在有一个文章管理系统,假设所有的文章内容都是存在数据库的一个字段里面,这个字段最长可以存储3000个字节。

    文章的平均长度是2000个字节。

    表结构简化如下:

    文章id

    文章标题

    文章内容

    1

    超级塞亚人

    我是超级塞亚人我喜欢吃苹果

    而这个系统里有几十万篇文章,你想要在这几十万篇文章里找出包含词语“我喜欢吃苹果”的数据。

    上面说过like的效率无比低下。那么如何替换呢?

    如果可以以搜索的“关键词”建立一个索引文件,那么问题似乎会变的容易,索引文件的逻辑结构如下:

    关键词

    文章id

    我喜欢吃苹果

    1

    当你搜索的时候,你会先搜索这个索引表,找到关键词为“我喜欢吃苹果”,然后你就获得了对应的文章id。这样搜索性能就会加快了很多。

    或许你现在似懂非懂,再看个详细例子。

    我们有这么一张数据表:

    文章id

    文章标题

    文章内容

    1

    超级塞亚人

    我是超级塞亚人我喜欢吃苹果,我不是天朝的人,也不是地球人

    2

    天朝大国

    我大天朝威武,我大天朝13亿人,我大天朝

    3

    我喜欢游泳

    游泳有很多好方法

    4

    动画片

    我儿子喜欢看动画片,尤其是七龙珠,因为里面有塞亚人,而且塞亚人喜欢吃苹果,他们不是地球人

    5

    运动

    我喜欢运动,喜欢跑步,喜欢游泳,喜欢健身,喜欢xxoo

    6

    打炮

    我是一个二战的老兵,这是我的回忆录,我最幸福的时光就是在天朝吃着苹果打炮

    7

    。。。

    8

    。。。

    9

    。。。

    然后,根据以上的文章内容,如果建立了一个索引文件(这里忽略索引文件的数据结构,仅仅以一种易于理解的方式呈现):

    关键词

    文章id

    塞亚人

    1,4

    苹果

    1,4,6

    天朝

    1,2,6

    地球

    1,4

    游泳

    3,5

    七龙珠

    4

    喜欢

    1,4,5,6

    那么当我想搜索  “塞亚人”的时候,这个索引文件直接告诉我在文章id为1和4的文章里有这个词。

    这个索引文件就是“全文索引”。

    (注:这里的索引文件仅仅易于理解才做成这种表格形势,在实现上有更复杂的数据结构--为了是在这么多个关键词里迅速的找到你想找的关键词啦!这里忽略数据结构的知识,仅从本质上说明全文索引是什么,为了解决什么,即使你没有任何的专业背景知识,只要你学过任何一门数据库的sql语句,相信都能看得懂啦!)

    到这里,我们已经解决了一个问题--什么是全文索引。^^

    通过观察上面的例子,如果你有心,你可能会思考这么一个问题:

    超级塞亚人,是一个词汇呢,还是分为“超级”,“塞亚人”两个词汇呢?

    这就是“分词”。

    现在有很多专门的分词系统啦!至于算法这里并不多介绍,(因为这不仅仅包括计算机知识啦,想做的更好得需要语言学专家帮助哦)

    现在我们已经知道了全文索引和分词。

    那么如何使用呢?也就是说你如何使用全文索引和分词的方式来帮助优化你的搜索呢?

    大体方案如下:

    为了简化概念,我们只从一个固定的套路开始讨论,这样就能省略数据源这些概念,而专心其工作方式啦:

    需要工作的程序:索引程序,分词程序,数据库。

    工作原理:

    1、索引程序从数据库读取数据,比如上面例子中的数据表,索引程序通过sql语句:select 文章id,文章标题,文章内容 from 文章表.获得文章的相关数据

    2、索引程序对需要索引的内容进行“分词”,而这里的分词就是调用分词程序啦!

    3、索引程序对分好词的一个个词条加入索引文件。

    在你写的代码里,原来到数据库----like %xxx%-----的语句

    就变成了到索引文件里去查找,从而找到相应的数据(这点相信你已经理解啦!)

    好了,原理部分介绍到这。

    mysql现在一般使用的版本其实也支持全文索引啦,索引类型为fulltext,只不过他的功能还不够强大:

    是对中文的支持不够好,无法智能分词

    不过要是纯英文搜索用他还是可以的,只不过要注意有个停止词的概念哦!

    那么用什么方法可以快速解决中文搜索的问题呢?

    你一定听说过sphinx。(即使没听说过也没关系啦,之后我们会以这个为例子来详细讲解)

    coreseek=sphinx+mmesg 这个程序就可以解决这个问题的啦。

    sphinx就是上面说的索引程序啦。

    mmseg就是分词程序啦。

    国内有人修改了sphinx源码,内建和mmseg配合,整合到一起就是coreseek啦!

    在下一篇中,

    1我们会结合上面的原理,具体分析coreseek的使用参数。

    2最后给出具体的分词索引方案。而不仅仅是“照着葫芦画瓢”。

    留下思考的问题:

    上面说的工作原理当中,sphinx读取数据库生成索引。那么如果sphinx生成完索引,mysql加入了新数据,这不是没有加入到索引当中吗?如何解决?

    展开全文
  • 特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常...
  • 数据库添加索引

    千次阅读 2020-07-16 16:41:34
    前言 ———————————————— 版权声明:本文为CSDN博主「愿做Bookworm」的原创文章,遵循CC ...这里我们学习如何利用sql语句进行循环添加数据,并在添加了大量的数据之后咱们就可以用到索引了!!快乐+1 知识+

    前言

    ————————————————
    版权声明:本文为CSDN博主「愿做Bookworm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_49313444/article/details/107287523
    

    本文转自CSDN博主「愿做Bookworm」的原创文章,在部分地方有自己的见解,也有所增加

    这里我们学习如何利用sql语句进行循环添加数据,并在添加了大量的数据之后咱们就可以用到索引了!!快乐+1 知识+2

    创建数据循环
    测试表代码

    create table test(location_id int ,location_name varchar(20));
    

    再编写存储过程,其中涉及到循环的使用。我们欲通过这个存储过程,来达到往表中插入数据的效果,这里插入一百万条Sql(「愿做Bookworm」博主内容,我们只需10万即可,数据越多,测试效果越明显,但是电脑带不动就不要轻易尝试添加这么多数据了)

    drop procedure if exists insert_while;
    delimiter //
    create procedure insert_while()
    begin
    	declare i int default 1;
    	while i<1000000 //注意:最好应自己电脑配置的实际情况而定!!!
    	do
    		insert into test values(i,concat('bookworm',i));
    		set i=i+1;
    	end while;
    	commit;
    end //
    delimiter ;
    
    

    运行以及花费时间:

    mysql> call test_loop();
    
    call insert_while()
    OK
    时间: 542.984s
    

    来自于CSDN博主「愿做Bookworm」

    5种索引以及创建方法

    1. 添加主键索引: alter table table_name add primary key ( column )

    2. 添加唯一索引: alter table table_name add unique ( column )

    3. 普通索引: alter table table_nameadd index index_name( column )

    4. 全文索引: alter table table_name add fulltext( column )

    5. 添加多列索引: alter table table_name add index index_name(column1,column2, column3 )

    6. 删除数据库索引:drop index indexname on TableName

    实验
    先查询一次吧

    SELECT * from test where location_name="bookworm1"
    

    结果耗时

    SELECT * from test where location_name="bookworm1"
    OK
    时间: 0.371s
    

    添加普通索引

    alter table test ADD index name_index(`location_name`)
    

    再来查询一次吧

    SELECT * from test where location_name="bookworm1"
    

    结果耗时

    SELECT * from test where location_name="bookworm1"
    OK
    时间: 0.001s
    

    如果这个时候再查询没有建立索引的列

    SELECT * from test where location_id=1
    

    结果:

    SELECT * from test where location_id=1
    OK
    时间: 0.356s
    

    所以建立了索引再进行查询真的十分快捷 从虫虫的小测试就可以看出足足快了上百倍不止,需要注意的是针对不同的查询列我们需要建立不同的索引

    各索引的最佳环境分析
    普通索引:唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件,只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

    唯一索引:如果能确定某个数据列将只包含彼此各不相同的值,就可以用唯一索引了,有两点好处,一是简化了MySQL对这个索引的管理工作;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了,如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。

    主键索引:必须为主键字段创建一个索引,这个索引就是所谓的"主索引"

    复合索引:

    想象一下,您有以下三个查询:
    
    查询I:
    
    SELECT * FROM homes WHERE `geolat`=42.9 AND `geolng`=36.4
    查询II:
    
    SELECT * FROM homes WHERE `geolat`=42.9
    问题III:
    
    SELECT * FROM homes WHERE `geolng`=36.4
    
    

    如果每列有单独的索引,则所有三个查询都使用索引。在MySQL中,如果您有复合索引(geolat,geolng),则只有查询I和查询II(使用composit索引的第一部分)使用索引。在这种情况下,查询III需要全表搜索。

    全文索引:文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。

    在这里插入图片描述

    要是能为您提供帮助,可以给予支持(关注、点赞、分享),

    ————————————————
    版权声明:本文为CSDN博主「愿做Bookworm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_49313444/article/details/107287523
    
    展开全文
  • 在MySql数据库中,有四种索引:聚焦索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FUNLLTEXT INDEX)。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术...
  • MySQL 之全文索引

    万次阅读 多人点赞 2018-04-14 15:47:56
    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。 引入 概念 通过数值比较、范围过滤等就可以...

    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。

    引入

    概念

    通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。

    你可能会说,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

    你可能没有注意过全文索引,不过至少应该对一种全文索引技术比较熟悉:各种的搜索引擎。虽然搜索引擎的索引对象是超大量的数据,并且通常其背后都不是关系型数据库,不过全文索引的基本原理是一样的。

    版本支持

    开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况

    1. MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
    2. MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
    3. 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

    测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。

    操作全文索引

    索引的操作随便一搜都是,这里还是再啰嗦一遍。

    创建

    1. 创建表时创建全文索引
    create table fulltext_test (
        id int(11) NOT NULL AUTO_INCREMENT,
        content text NOT NULL,
        tag varchar(255),
        PRIMARY KEY (id),
        FULLTEXT KEY content_tag_fulltext(content,tag)  // 创建联合全文索引列
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    1. 在已存在的表上创建全文索引
    create fulltext index content_tag_fulltext
        on fulltext_test(content,tag);
    1. 通过 SQL 语句 ALTER TABLE 创建全文索引
    alter table fulltext_test
        add fulltext index content_tag_fulltext(content,tag);

    修改

    修改个 O,直接删掉重建。

    删除

    1. 直接使用 DROP INDEX 删除全文索引
    drop index content_tag_fulltext
        on fulltext_test;
    1. 通过 SQL 语句 ALTER TABLE 删除全文索引
    alter table fulltext_test
        drop index content_tag_fulltext;

    使用全文索引

    和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如

    select * from fulltext_test 
        where match(content,tag) against('xxx xxx');

    注意: match() 函数中指定的列必须和全文索引中指定的列完全相同,否则就会报错,无法使用全文索引,这是因为全文索引不会记录关键字来自哪一列。如果想要对某一列使用全文索引,请单独为该列创建全文索引。

    测试全文索引

    添加测试数据

    有了上面的知识,就可以测试一下全文索引了。

    首先创建测试表,插入测试数据

    create table test (
        id int(11) unsigned not null auto_increment,
        content text not null,
        primary key(id),
        fulltext key content_index(content)
    ) engine=MyISAM default charset=utf8;
    
    insert into test (content) values ('a'),('b'),('c');
    insert into test (content) values ('aa'),('bb'),('cc');
    insert into test (content) values ('aaa'),('bbb'),('ccc');
    insert into test (content) values ('aaaa'),('bbbb'),('cccc');

    按照全文索引的使用语法执行下面查询

    select * from test where match(content) against('a');
    select * from test where match(content) against('aa');
    select * from test where match(content) against('aaa');

    根据我们的惯性思维,应该会显示 4 条记录才对,然而结果是 1 条记录也没有,只有在执行下面的查询时

    select * from test where match(content) against('aaaa');

    才会搜到 aaaa 这 1 条记录。

    为什么?这个问题有很多原因,其中最常见的就是 最小搜索长度 导致的。另外插一句,使用全文索引时,测试表里至少要有 4 条以上的记录,否则,会出现意想不到的结果。

    MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说,想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。

    这两个的默认值可以使用以下命令查看

    show variables like '%ft%';

    可以看到这两个变量在 MyISAM 和 InnoDB 两种存储引擎下的变量名和默认值

    // MyISAM
    ft_min_word_len = 4;
    ft_max_word_len = 84;
    
    // InnoDB
    innodb_ft_min_token_size = 3;
    innodb_ft_max_token_size = 84;

    可以看到最小搜索长度 MyISAM 引擎下默认是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只会对长度大于等于 4 或者 3 的词语建立索引,而刚刚搜索的只有 aaaa 的长度大于等于 4。

    配置最小搜索长度

    全文索引的相关参数都无法进行动态修改,必须通过修改 MySQL 的配置文件来完成。修改最小搜索长度的值为 1,首先打开 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面追加以下内容

    [mysqld]
    innodb_ft_min_token_size = 1
    ft_min_word_len = 1

    然后重启 MySQL 服务器,并修复全文索引。注意,修改完参数以后,一定要修复下索引,不然参数不会生效。

    两种修复方式,可以使用下面的命令修复

    repair table test quick;

    或者直接删掉重新建立索引,再次执行上面的查询,a、aa、aaa 就都可以查出来了。

    但是,这里还有一个问题,搜索关键字 a 时,为什么 aa、aaa、aaaa 没有出现结果中,讲这个问题之前,先说说两种全文索引。

    两种全文索引

    自然语言的全文索引

    默认情况下,或者使用 in natural language mode 修饰符时,match() 函数对文本集合执行自然语言搜索,上面的例子都是自然语言的全文索引。

    自然语言搜索引擎将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过 50% 的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。上面提到的,测试表中必须有 4 条以上的记录,就是这个原因。

    这个机制也比较好理解,比如说,一个数据表存储的是一篇篇的文章,文章中的常见词、语气词等等,出现的肯定比较多,搜索这些词语就没什么意义了,需要搜索的是那些文章中有特殊意义的词,这样才能把文章区分开。

    布尔全文索引

    在布尔搜索中,我们可以在查询中自定义某个被搜索的词语的相关性,当编写一个布尔搜索查询时,可以通过一些前缀修饰符来定制搜索。

    MySQL 内置的修饰符,上面查询最小搜索长度时,搜索结果 ft_boolean_syntax 变量的值就是内置的修饰符,下面简单解释几个,更多修饰符的作用可以查手册

    • + 必须包含该词
    • - 必须不包含该词
    • > 提高该词的相关性,查询的结果靠前
    • < 降低该词的相关性,查询的结果靠后
    • (*)星号 通配符,只能接在词后面

    对于上面提到的问题,可以使用布尔全文索引查询来解决,使用下面的命令,a、aa、aaa、aaaa 就都被查询出来了。

    select * test where match(content) against('a*' in boolean mode);

    总结

    好了,差不多写完了,又到了总结的时候。

    MySQL 的全文索引最开始仅支持英语,因为英语的词与词之间有空格,使用空格作为分词的分隔符是很方便的。亚洲文字,比如汉语、日语、汉语等,是没有空格的,这就造成了一定的限制。不过 MySQL 5.7.6 开始,引入了一个 ngram 全文分析器来解决这个问题,并且对 MyISAM 和 InnoDB 引擎都有效。

    事实上,MyISAM 存储引擎对全文索引的支持有很多的限制,例如表级别锁对性能的影响、数据文件的崩溃、崩溃后的恢复等,这使得 MyISAM 的全文索引对于很多的应用场景并不适合。所以,多数情况下的建议是使用别的解决方案,例如 Sphinx、Lucene 等等第三方的插件,亦或是使用 InnoDB 存储引擎的全文索引。

    几个注意点

    1. 使用全文索引前,搞清楚版本支持情况;
    2. 全文索引比 like + % 快 N 倍,但是可能存在精度问题;
    3. 如果需要全文索引的是大量数据,建议先添加数据,再创建索引;
    4. 对于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。

    参考文章

    mysql全文索引__简介
    MySQL 官方参考手册
    高性能 MySQL(第三版)

    本文原始链接:MySQL 之全文索引

    展开全文
  • Solr3.6用DIH组件进行MySQL数据库全文索引部署包 完整的工程部署包 apache-solr-3.6.0.xml 放入apache-tomcat-7.0.27\conf\Catalina\localhost
  • 索引普通索引唯一索引全文索多列索引隐藏索引删除索引设计原则 普通索引 索引存储: 数据库底层索引实现主要有两种存储类型,B树(BTREE)和哈希(HASH)索引,InnoDB和MyISAM 使用BTREE索引;而MEMORY 存储引擎可以...

    普通索引

    索引存储:
    数据库底层索引实现主要有两种存储类型,B树(BTREE)和哈希(HASH)索引,InnoDB和MyISAM 使用BTREE索引;而MEMORY 存储引擎可以使用BTREE 和HASH 索引,默认用BTREE.在没有指定的情况下,数据库使用的引擎是 InnoDB。

    1. 可以提高检索数据的速度。
    2. 创建和维护索引需要耗费时间,耗费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除和修改数据时,要动态地维护索引,造成数据的维护速度降低了。
    3. 索引可以提高查询的速度,但是会影响插入记录的速度,因为向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后再创建索引。

    普通索引,就是在创建索引时,不附加任何限制条件(唯一、非空等限制)。该类型的索引可以创建在任何数据类型的字段上。

    CREATE TABLE tablename(
        propname1 type1,
        propname2 type2,
        ……
        propnamen type..n,
         INDEX | KEY
        [indexname] (propnamen [(length)] [ ASC | DESC ] ) );
    

    其中,参数INDEX和KEY是用来指定字段为索引的,两者选择其中之一就可以了,作用是一样的;参数indexname是索引名字,可省略;参数propnamen是索引对应的字段的名称,该字段必须为前面定义好的字段;参数length是可选参数,其指索引的长度,必须是字符串类型才可以使用;参数ASC和DESC都是可选参数,ASC表示升序排列,DESC表示降序排列,如果不指定,则为升序。

    在这里插入图片描述

    唯一索引

    唯一索引,就是在创建索引时,限制索引的字段值必须是唯一的。通过该类型的索引可以比普通索引更快速地查询某条记录。

    CREATE TABLE tablename(
        propname1 type1,
        ……
        propnamen type..n,
        UNIQUE INDEX | KEY [indexname] (propnamen [(length)] [ ASC | DESC ] ) );
    

    UNIQUE INDEX和UNIQUE KEY是用来指定字段为索引的,两者选择其中之一即可;参数indexname是索引名字,可省略;参数propnamen是索引对应的字段的名称,该字段必须为前面定义好的字段且必须定义为 UNIQUE 约束;参数length是可选参数,其指索引的长度,必须是字符串类型才可以使用;参数ASC和DESC都是可选参数,ASC表示升序排列,DESC表示降序排列,如果不指定,则为升序。在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    全文索

    全文索引主要对字符串类型建立基于分词的索引,主要是基于CHAR、VARCHAR和TEXT的字段上,以便能够更加快速地查询数据量较大的字符串类型的字段。

    1. 全文索引以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符。
    2. 在默认情况下,全文索引的搜索执行方式为不区分大小写,如果全文索引所关联的字段为二进制数据类型,就以区分大小写的搜索方式执行。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    MySQL8 中文分词支持
    配置文件my.ini(Windows 10默认路径: C:\ProgramData\MySQL\MySQL Server 8.0) 中增加如下配置项,同时重启MySQL80 服务:

    [mysqld]
    ngram_token_size=2
    

    多列索引

    多列索引,是指在创建索引时所关联的字段不是一个字段,而是多个字段,虽然可以通过所关联的字段进行查询,但是只有查询条件中使用了所关联字段中的第一个字段,多列索引才会被使用。

    和普通索引定义基本相同,不同之处就是增加了多个索引列。

    在这里插入图片描述

    隐藏索引

    隐藏索引可以用来测试索引的性能。验证索引的必要性时不需要删除索引,可以先将索引隐藏,如果优化器性能无影响就可以真正地删除索引。

    ALTER TABLE tablename ALTER  INDEX  index_name INVISIBLE;  #隐藏索引
    ALTER TABLE tablename ALTER  INDEX  index_name VISIBLE;    #取消隐藏
    

    删除索引

    要删除索引,是因为这些索引会降低表的更新速度,影响数据库的性能。

       DROP INDEX indexname ON tablename;  
    

    修改索引: 先删除,后增加

    设计原则

    1. 选择唯一性索引,唯一性索引的值是唯一的,可以更快速地通过该索引来确定某条记录。
    2. 经常需要排序、分组和联合操作的字段建立索引
    3. 经常作为查询条件的字段建立索引
    4. 限制索引的数目
    5. 尽量使用数据量少的索引
    6. 尽量使用前缀来索引
    7. 删除不再使用或者很少使用的索引
    展开全文
  • Lucence全文索引数据库索引

    千次阅读 2012-04-13 17:05:44
    lucence ...Lucene是一个基于Java的全文索引工具包。...1. 基于Java的全文索引引擎...2. 全文检索的实现:Luene全文索引数据库索引的比较 3. 中文切分词机制简介:基于词库和自动切分词算法的比较 4. 具体的安
  • MYSQL5.7数据库建立全文索引失败问题

    千次阅读 2019-11-01 00:17:01
    MYSQL5.7数据库建立全文索引失败问题数据库中执行该语句后报错 ALTER TABLE rule ADD FULLTEXT INDEX ft_index (target) WITH PARSER ngram 提示:[Err] 1128 - Function 'ngram' is not defined 网上百度了一下,...
  • 索引是数据库中用来加快检索速度的数据结构,常用的索引有B+索引和hash索引以及全文索引。 索引使用的利弊以及注意事项 需要使用索引的情况 1、在经常需要搜索的列上建立索引,可以加快搜索的速度; 2、在作为主键的...
  • 本篇为简单起见,仅在varchar型字段上图文演示非常完整的而且是高效可行的全文索引创建及维护过程.1:在企业管理器中展开要建立全文索引数据库,右击“全文目录”,选择“新建全文目录”如 图1 所示。可以修改全文...
  • MySQL数据库索引

    万次阅读 多人点赞 2018-09-23 09:31:41
    全文索引 使用索引一定能提高查询性能吗? 哪些情况下设置了索引但是无法使用 哪些情况下需要设置索引、哪些情况下不需要 什么情况下应该使用组合索引而非单独索引 MySQL中索引是如何组织数据的存储的 在MySQL...
  • HugeGraph 索引介绍 ...设置定点article的name字段为全文索引(可以模糊检索) schema.indexLabel("articleByNameSearch") .onV("article") .by("name") .search() .ifNotExist() ...
  • 如何获得数据库里有多少个全文索引。删除全文索引的方法 SQL server 2005 今天使用命令备份数据库的时候发生了异常: Msg 3007, Level 16, State 1, Line 4 The backup of the file or filegroup "sysft_db_...
  • <br />一个完整的SQL SERVER数据库全文索引的示例。(以pubs数据库为例) 首先,介绍利用系统存储过程创建全文索引的具体步骤: 1) 启动数据库的全文处理功能 (sp_fulltext_database) 2) 建立...
  • mysql全文索引

    千次阅读 2019-04-24 10:23:53
    1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网, 1.1. 创建表...
  • 数据库的模糊搜索 和 搜索引擎的功能 不是一...不过使用数据库来实现搜索引擎也是一个思路,我有一个基于分布式数据库全文索引的方案(代号x) 相比solr或elasticsearch的区别如下: 1 solr或elasticsearch是以
  • 本文示范完整的SQL SERVER数据库全文索引以pubs数据库为例首先,介绍利用系统存储过程创建全文索引的具体步骤:1) 启动数据库的全文处理功能 (sp_fulltext_database)2) 建立全文目录 (sp_fulltext_catalog)3) 在...
  • 一个完整的SQL SERVER数据库全文索引的示例。(以pubs数据库为例) 首先,介绍利用系统存储过程创建全文索引的具体步骤: 1) 启动数据库的全文处理功能 (sp_fulltext_database) 2) 建立全文目录 (sp_fulltext...
  • 数据库--索引详解

    千次阅读 多人点赞 2018-08-08 22:34:52
    数据库索引是用于提高数据库表的数据访问速度的。想要理解索引原理必须清楚一种数据结构「平衡树」(非二叉),也就是b tree或者 b+ tree,重要的事情说三遍:“平衡树,平衡树,平衡树”。当然, 有的数据库也使用...
  • mysql中文进行全文索引支持问题

    千次阅读 2015-09-07 19:54:11
    先来看看对一个字段做全文索引,作为一个数据库系统需要做哪些工作? 假设一个文章表里面包含几个字段:文章id、文章作者、文章标题、文章内容   比如,我们对文章内容这个字段artilce_content建立全文索引,...
  • 第7章 索引 索引是一种特殊的数据库结构可以用来快速查询数据库表中的特定记录索引是提高数据库性能的重要方式MySQL中所有的数据类型都可以被索引MySQL的索引包括普通索引惟一性索引全文索引单列索引多列索引和空间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,648
精华内容 37,859
关键字:

数据库全文索引出问题