8
回答
MySQL查询优化,如何优化 Select title from law where title like '%****%'查询
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

如何优化MySQL的LIKE ’%....%‘查询?

现在有一张表law,字段有id int,title text,content text,

系统中有一个功能是从该表中查询出标题含某字符串(如找出标题含“中华人民共和国天朝法”的数据),目前直接使用like %%查询,因为数据已经超过1000000万行,性能自然很差,所以需要对这个功能做性能优化,目前可选方案有:

1.使用全文索引,可以显著提高性能,但是搜索结果与like %%不一样,而且很多情况下检索不出包含某个字符串的数据;

2.使用外部的搜索引擎;这会增加系统复杂度,而且数据变动频繁的话索引会给服务器带来很大压力;

3.干掉这变态的功能,很遗憾不可能;


同学们有其他方案和建议吗?

谢谢,谢谢谢

举报
喂码呢
发帖于5年前 8回/2K+阅
共有8个答案 最后回答: 5年前

为 law 表的 title字段添加 fulltext 索引

alter talbe `law` add fulltext (`title`);

查询的时候改用如下语句

select * from law where match(title) against ('中华人民共和国天朝法' IN BOOLEAN MODE);

如果查不到结果 那么可能是对中文支持不好.

可参考 张宴的 blog  http://blog.s135.com/post/356/ 

不过mysqlcft 很久没更新过了..

还有一个方法,就是另外加一张表law_title,包含列id,title_suffix,其中titile_suffix是title的所有后缀。

select law.* from law join law_title on law.id=law_title.id where law_title.title_suffix like '******%';

--- 共有 2 条评论 ---
panmingguang的确, 另一张表的构造 有很大的难度, 数据量也不少 5年前 回复
喂码呢这种情况下,如果标题有一百个字符那就有九十九个后缀 这个没有可行性呀, 不过思路不错 5年前 回复

全文索引是唯一的办法

--- 共有 1 条评论 ---
喂码呢全文索引有一个问题是,但一个词在大部分的标题里都有的时候,mysql会认为这样的词选择性比较差,会把它个去掉,比如“中华人民共和国”在大部分法规的标题里都有,所以这是后再用全文索引搜索得到的结果和like %%就不一样了 5年前 回复

引用来自“canghua”的答案

还有一个方法,就是另外加一张表law_title,包含列id,title_suffix,其中titile_suffix是title的所有后缀。

select law.* from law join law_title on law.id=law_title.id where law_title.title_suffix like '******%';

其中titile_suffix是title的所有后缀。  后缀是什么东西??

后缀like '***%'  可以具体点么,  这个问题我也很想知道

引用来自“panmingguang”的答案

引用来自“canghua”的答案

还有一个方法,就是另外加一张表law_title,包含列id,title_suffix,其中titile_suffix是title的所有后缀。

select law.* from law join law_title on law.id=law_title.id where law_title.title_suffix like '******%';

其中titile_suffix是title的所有后缀。  后缀是什么东西??

后缀like '***%'  可以具体点么,  这个问题我也很想知道

比如对于'abcd',有4个后缀串:'abcd','bcd','cd','d',这样任意子串查询就可以转换为后缀的前缀,而前缀匹配一般是可以使用索引的。

顶部