Mysql 使用全文索引

针对MySQL在模糊查询方面的性能瓶颈,本文介绍了如何通过全文索引提高查询效率,特别是当数据量达到百万级别时。文中详细讲解了全文索引的创建与配置过程,包括对中文分词的支持情况。

Mysql数据量达到百万级别以后,查询性能很低,尤其是在模糊查询方面,采用like %xxx%形式,速度难以接受,200万数据,查询需要大约10秒,当然根据like的内容,如果采用limit形式,不使用order by,关键词出现频率高的查询效率会好一些,但是较为低的查询效率很是问题。


MySQL5.6之前 fulltext索引只支持MyISAM的表类型,5.6开始在InnoDB类型中开始支持。


建立全文索引需要注意,默认索引词最小单位是4,一般都需要稍微修改一下,show variables like 'ft_min_word_len'; 查看默认

linux 修改/etc/my.cnf中配置,将ft_min_word_len=1加到mysqld下保存,并重启服务器。

表上建立全文索引,多个字段逗号隔开,全文索引查询时也要多个字段

alter table xxx add fulltext(nickname);

SELECT
			c.id,
			c.nickname
			 
		FROM
			xxxx c
		where  match(c.nickname) against ('框渣' in boolean mode) 
		limit 10;
如果查询不到数据执行:

repair table xxxx;

索引重新建立一下。

再次执行应该就可以查询到数据了,查询采用match(col1,col2..) against ('关键词1,xxxx,xxx,'),该形式是返回浮点类型代表匹配度,使用in boolean mode时布尔类型,只返回0/1,此外还有一些通配符,需要的可以百度看一下。

另外,这个对中文的支持不好,据说新版的自带了中文分词插件,不带分词插件情况下,只能全词才能匹配到,模糊的匹配不到。


MySQL 全文索引使用主要包括创建全文索引使用搜索语句进行查询,以及必要时修改相关配置,以下是详细介绍: ### 创建全文索引 在创建全文索引时,需先确定要索引的列,即包含文本数据的列。创建方式有两种,一是在创建表时创建,二是在已有表中添加全文索引。 - **创建表时创建全文索引**: ```sql CREATE TABLE table_name ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, author VARCHAR(200), title VARCHAR(200), content TEXT(500), FULLTEXT full_index_name (content) ) ENGINE=InnoDB; ``` - **在已有表中添加全文索引**: ```sql ALTER TABLE table_name ADD FULLTEXT (column); ``` 例如,为 `articles` 表的 `content` 列添加全文索引: ```sql ALTER TABLE articles ADD FULLTEXT(content); ``` ### 删除全文索引 若需删除全文索引,可使用以下语句: ```sql DROP INDEX index_name ON table_name; ``` ### 搜索语句 使用 `MATCH` 和 `AGAINST` 函数进行全文搜索。 - **单词搜索**: ```sql SELECT * FROM table_name WHERE MATCH(column) AGAINST('搜索值'); ``` - **多词搜索**:多词用逗号或空格分开 ```sql SELECT * FROM table_name WHERE MATCH(column) AGAINST('a,b'); ``` ### 修改配置 当搜索单个字符没有结果,或个别词的出现频率超过 50%被认作无效词时,可能需要修改全文索引关键词长度设置。找到 `mysql.ini`,在 `[mysqld]` 位置添加 `ft_min_word_len=1`,然后重启 MySQL 服务。查看 MySQL 环境变量可使用 `show variables;` 语句 [^2]。 ### 注意事项 - MySQL 5.6 版本以下只有 MyISAM 存储引擎支持全文索引MySQL 5.6 以上版本 MyISAM 和 InnoDB 都支持全文索引 [^2]。 - 当个别词的出现频率超过 50%时,被认作无效词,可改为 `AGAINST ('高频词' IN BOOLEAN MODE)` 进行搜索 [^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值