【高分求助】mysql怎么高效率地检索某段字符,like和全文检索都不行

SexyCode
博客专家认证
2015-03-24 07:32:09
背景
优化一个数据库,其中一张表的记录数量已经达到20万以上,表中有一字段是查询号,由一串连在一起的数字和英文组成,如
'US2009484321A'、'US2009485222A','US2003617086A'
目的
想让用户能够通过输入该字段的一部分去检索,比如输入’2009‘,就可以检索到'US2009484321A'和'US2009485222A',输入us则可以检索到'US2009484321A'、'US2009485222A','US2003617086A'
问题
原先的大神写的sql语句是
SELECT DISTINCT xxx,yyy,zzz FROM table WHERE chaxunhao LIKE '%2009%' \G 执行一次要近一分钟
我一上来就explain这段sql语句,发现没有使用索引,于是给chaxunhao字段添加了普通索引
create index index_cxh on table(chaxunhao );
可是mysql在 LIKE '%xxx' 即百分号在前缀时不会使用索引。。结果效率不能提升
求大神给个可行的解决办法!

不能使用全文索引!
小弟曾天真的使用全文索引去搞,结果发现全文索引是针对单词的,即他会把'US2009484321A'整个看做一段字符!

...全文
3557 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_512902011 2017-02-13
  • 打赏
  • 举报
回复
like '%xxx' or like 'xxx%' 这写 如果检索的字符串正好在 左边和右边的时候 是可以用到索引的 如果正好在中间 那就用不到索引 我记得是这样 楼上说全文检索 我在oracle中试过 这个跟分词有关系 分得细效率低 和用like差不多 普通分词 又会出现有写数据查询不出来的情况
helen_elva 2016-12-29
  • 打赏
  • 举报
回复
引用 9 楼 hzy38324 的回复:
[quote=引用 7 楼 withinfly 的回复:] 楼主..你是怎么解决的啊.我现在也是遇到这个问题..
参考http://blog.csdn.net/hzy38324/article/details/44975859这篇博文 [/quote] 这篇博文已经删除了。楼主大概说下解决方案?
SexyCode 2015-12-30
  • 打赏
  • 举报
回复
引用 7 楼 withinfly 的回复:
楼主..你是怎么解决的啊.我现在也是遇到这个问题..
参考http://blog.csdn.net/hzy38324/article/details/44975859这篇博文
SexyCode 2015-12-30
  • 打赏
  • 举报
回复
参考http://blog.csdn.net/hzy38324/article/details/44975859这篇博文
45度C 2015-12-29
  • 打赏
  • 举报
回复
楼主..你是怎么解决的啊.我现在也是遇到这个问题..
SexyCode 2015-04-06
  • 打赏
  • 举报
回复
好吧,这个帖子最后是被我自己解决了。 方法是覆盖索引 具体方法见 http://blog.csdn.net/hzy38324/article/details/44857721
铁衣 2015-03-26
  • 打赏
  • 举报
回复
你这个要用全文索引。
九月茅桃 2015-03-26
  • 打赏
  • 举报
回复
关系型数据库对于%%无法优化的啊。
九月茅桃 2015-03-26
  • 打赏
  • 举报
回复
引用 4 楼 hzy38324 的回复:
[quote=引用 3 楼 carrd2008 的回复:] 你这个要用全文索引。
谢谢。我试过全文索引,结果不可行。 原因是 全文索引是索引单词的,我这里的字段是一连串字符连在一起,中间没有逗号,如题目中所说的'US2009484321A'、'US2009485222A','US2003617086A',如果采用全文索引 select * from tablewhere match(chaxunhao) against(‘2009’);去查,返回结果会是空。[/quote]
引用 4 楼 hzy38324 的回复:
[quote=引用 3 楼 carrd2008 的回复:] 你这个要用全文索引。
谢谢。我试过全文索引,结果不可行。 原因是 全文索引是索引单词的,我这里的字段是一连串字符连在一起,中间没有逗号,如题目中所说的'US2009484321A'、'US2009485222A','US2003617086A',如果采用全文索引 select * from tablewhere match(chaxunhao) against(‘2009’);去查,返回结果会是空。[/quote] 你这种属于搜索引擎的范畴,还是使用搜索引擎专门的工具luence或者solr吧。
SexyCode 2015-03-26
  • 打赏
  • 举报
回复
引用 3 楼 carrd2008 的回复:
你这个要用全文索引。
谢谢。我试过全文索引,结果不可行。 原因是 全文索引是索引单词的,我这里的字段是一连串字符连在一起,中间没有逗号,如题目中所说的'US2009484321A'、'US2009485222A','US2003617086A',如果采用全文索引 select * from tablewhere match(chaxunhao) against(‘2009’);去查,返回结果会是空。
SexyCode 2015-03-25
  • 打赏
  • 举报
回复
看来CSDN没有数据库高手

8,028

社区成员

发帖
与我相关
我的任务
社区描述
高性能数据库开发
社区管理员
  • 高性能数据库开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧