mysqlfulltext长度为1

mysqlfulltext长度为1,第1张

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

引入

概念

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

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

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

版本支持

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

MySQL 56 以前的版本,只有 MyISAM 存储引擎支持全文索引;

MySQL 56 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;

只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

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

*** 作全文索引

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

创建

创建表时创建全文索引

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;

在已存在的表上创建全文索引

create fulltext index content_tag_fulltext

on fulltext_test(content,tag);

通过 SQL 语句 ALTER TABLE 创建全文索引

alter table fulltext_test

add fulltext index content_tag_fulltext(content,tag);

修改

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

删除

直接使用 DROP INDEX 删除全文索引

drop index content_tag_fulltext

on fulltext_test;

通过 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');

假如你有一个表,

SQL> CREATE TABLE test_tab (

2 id INT,

3 name VARCHAR(10),

4 age INT,

5 val VARCHAR(10)

6 );

你的业务,有一个查询,是

SELECT FROM test_tab WHERE name = 一个外部输入的数据

刚开始,数据不多的时候,执行效果还不错。

随着数据量的增加,这个查询,执行起来,越来越慢了。

然后在 name 上面 建立了索引

CREATE INDEX idx_test4_name ON test_tab (name );

这样, 可以加快前面那个查询的速度。

但是,某天,你执行了下面这个SQL, 发现速度又慢了

SELECT FROM test_tab WHERE age = 25

为啥呢? 因为 age 字段上面,没有索引

索引只在 name 上面有

换句话说, 也就是 WHERE 里面的条件, 会自动判断,有没有 可用的索引,如果有, 该不该用。

多列索引,就是一个索引,包含了2个字段。

例如:

CREATE INDEX idx_test_name_age ON test_tab (name, age);

那么

SELECT FROM test_tab

WHERE

name LIKE '张%'

AND age = 25

这样的查询,将能够使用上面的索引。

多列索引,还有一个可用的情况就是, 某些情况下,可能查询,只访问索引就足够了, 不需要再访问表了。例如:

SELECT

AVG( avg ) AS 平均年龄

FROM

test_tab

WHERE

name LIKE '张%'

这个时候, name 与 age 都包含在索引里面。 查询不需要去检索表中的数据。

1 索引的创建

mongodb采用ensureIndex来创建索引,如:

dbuserensureIndex({"name":1})

表示在user集合的name键创建一个索引,这里的1表示索引创建的方向,可以取值为1和-1

在这里面,我们没有给索引取名字,mongodb会为我们取一个默认的名字,规则为keyname1_dir1_keyname2_dir2keynameN_dirN

keyname表示键名,dir表示索引的方向,例如,上面的例子我们创建的索引名字就是name_1

索引还可以创建在多个键上,也就是联合索引,如:

> dbuserensureIndex({"name":1,"age":1})

这样就创建了name和age的联合索引

除了让mongodb默认索引的名字外,我们还可以去一个方便记的名字,方法就是为ensureIndex指定name的值,如:

> dbuserensureIndex({"name":1},{"name":"IX_name"})

这样,我们创建的索引的名字就叫IX_name了

2 唯一索引

与RDB类似,我们也可以定义唯一索引,方法就是指定unique键位true:

>dbuserensureIndex({"name":1},{"unique":true})

3查看我们建立的索引

索引的信息存在每个数据库的systemindexes集合里面,对这个集合只能有ensureIndex和dropIndexes进行修改,不能手动插入或修改集合。

通过> dbsystemindexesfind()可以找到数据库中多有的索引:

> dbsystemindexesfind()

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testentities", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testblog", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testauthors", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testpapers", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testanalytics", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testuser", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testfood", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testuserinfo", "name" : "_id_" }

{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "testuserinfo", "name" : "_id_" }

{ "v" : 1, "key" : { "name" : 1 }, "ns" : "testuser", "name" : "IX_name" }

4删除索引

如果索引没有用了,可以使用dropIndexes将其删掉:

> dbrunCommand({"dropIndexes":"user","index":"IX_name"})

{ "nIndexesWas" : 2, "ok" : 1 }

ok表示删除成功

举个例子吧。\x0d\\x0d\例如你有一个学生表。\x0d\字段包含学号,班级,姓名,性别,出生年月日。\x0d\\x0d\你创建一个组合索引(班级,姓名)\x0d\那么\x0d\SELECTFROM学生表WHERE班级='2010级3班'AND姓名='张三'将使用索引\x0d\SELECTFROM学生表WHERE班级='2010级3班'将使用索引\x0d\SELECTFROM学生表WHERE姓名='张三'将不使用索引。\x0d\\x0d\删除掉上面的索引\x0d\再创建两个独立索引\x0d\索引1(班级)\x0d\索引2(姓名)\x0d\\x0d\那么\x0d\SELECTFROM学生表WHERE班级='2010级3班'AND姓名='张三'将根据数据库的分析信息,自动选择使用索引1或者索引2中的一个(理论上会使用索引2,因为姓名=张三的人少,优先找到所有姓名为张三的人以后,然后再从这些数据中,找班级='2010级3班'的\x0d\)\x0d\\x0d\SELECTFROM学生表WHERE班级='2010级3班'将使用索引1\x0d\SELECTFROM学生表WHERE姓名='张三'将使用索引2。

以上就是关于mysqlfulltext长度为1全部的内容,包括:mysqlfulltext长度为1、MYSQL索引问题:索引在查询中如何使用看了很多资料都只说索引的建立。是否建立了就不用再理会、mongodb新插入数据时需要重新建索引吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10189540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存