mysql 全文搜索

由于作系统时用到了模糊查询,涉及到了全文搜索的问题,这里分享下经验 sql

 咱们先定义什么是全文搜索的难题 数据库

作数据库查询时,随着数据量的增大,性能也会随之降低。性能

使用索引,可使查询不至于在所有数据中遍历,从而保证查询速度能够接受 就是说你有 500 万条数据时,加 where 条件,会使数据库去逐行对比 500 万条数据每一行数据的值,很是耗时 加了索引后,直接就能筛选出知足 where 条件的记录,不须要进行遍历,使用 explain 就能够看到 SQL 对比的条数优化

 可是在作文本的搜索时,常常要模糊查找,好比搜索 "订单" 时,咱们但愿得出 "采购订单", "订单出库" 这两条记录 最直接的方法是在 where 里写 like %条件% 这个时候,分两种状况讨论。索引

当 % 在后面时,索引可以保证遍历的数据量是符合以关键字开头的记录的数量,这种状况下,索引能有效减小对比的条数 而当 % 在前面时,因为不知道怎么缩小结果范围,所以依然会遍历整个表,这种状况在索引无效 也就是说最简单的作法是直接写 where like 条件% 这样固然知足不了咱们的要求,搜索 "订单" 时,没法获得 "采购订单" 的记录 产品

这个时候就是全文搜索派上用场的地方。也就是说,全文搜索是用于在大量数据中作模糊查询的优化方法 接下来是正题,如何作全文搜索,具体而言,如何在 MySQL 里作全文搜索 it

 从 MySQL 5.0 后支持一种 FULLTEXT 的索引类型(innodb 在 5.6 之后支持),在须要模糊查询的列中,创建这个索引就能够支持全文搜索 where 条件的写法不是 like 而是 match() ... against innodb

可是,中文的分词与英文不一致,英文使用空格分词,中文由语义进行分词,所以默认状况下全文搜索没法在汉字里搜索 这个时候须要手动指定一个分词器 ngram,这个在 MySQL 5.7 中被 innodb 支持,搜索

须要这样创建索引: ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram; 查询时这样写: SELECT * FROM articales WHERE MATCH(body) AGAINST("keywords" IN BOOLEAN MODE); 遍历

 这样 sql explain 时就能够看到影响的 rows 仅为 1,证实咱们没有进行全表的遍历 结论: 全文搜索是在模糊查询时进行优化的一个手段,当须要在大量数据中搜索子串时可以提升性能。

好比能够加快搜索产品名称中的 "硫酸脲" 的速度。不过这也是在大量数据的前提下的,若是要进行全文搜索的表不到 10 万行,直接使用 %like% 也能够接受。


仅此记录他言--

相关文章
相关标签/搜索