由于作系统时用到了模糊查询,涉及到了全文搜索的问题,这里分享下经验 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% 也能够接受。
仅此记录他言--