国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 数据库 > 数据库应用 > [置顶] 数据库调优教程(十) 【精华章节】解决like ’%str’ 时索引不被使用的4种方法

[置顶] 数据库调优教程(十) 【精华章节】解决like ’%str’ 时索引不被使用的4种方法

来源:程序员人生   发布时间:2015-04-20 08:28:27 阅读次数:3592次

3、           索引


7.      解决like’%str’不使用模糊查询的4种方法


上1讲最后说了,只要模糊查询的模糊值在字符串前面,则不会使用索引,‘%aaa’和‘_aaa’都不会!

以下


应当说这是Mysql给程序员们开的1个玩笑。要是我的表数据量很大,而且又需要使用like’%%’这样的模糊查询来检索时,该怎样办??

接下来,笔者将会给大家分享解决这个问题的4种方法


1)    Select主键

只要Select的字段恰好是主键,那末就会使用到索引(只对innodb数据库有效)

比以下面的

select idfrom emp where ename like '%haha%'G

就使用了索引


select * from empwhere ename like '%haha%'G

则不使用索引



除主键,其他字段必须设置为覆盖索引才能使索引生效,不能单独设置索引

比以下面这类是不会使用索引的


可以采取分步查询的方法,先select主键再利用主键去找其他字段。不过好像比较麻烦!别怕!接下来会讲1种最优方法――覆盖索引法!


2)    覆盖索引法

覆盖索引是1种特殊的多列索引,当多列索引指向1个查询语句中所有的字段时,该多列索引就被称为覆盖索引

使用覆盖索引可以解决问题!

创建覆盖索引


固然,如果你想要select很多字段乃至是select*,那你可以创建1个多列索引指向所有字段(innodb可以不指向主键)



注意:

笔者发现,当覆盖索引指向的字段是varchar(380)及380以上的字段时,覆盖索引会失效!

 

3)    全文索引法

此方法有较大局限。

全文索引,只对MyISAM引擎有用。主要是针对对文件,文本的检索, 比如文章或段落,.

它会把某个数据表的某个数据列出现过的所有单词生成1份清单

少于3个字符的单词不会被包括在全文索引里,可以通过修改my.cnf修改选项

ft_min_word_len=3

但是!

全文索引不完全同等于模糊查询

比如title字段有这么个数据’abcd20088ccaa’,使用模糊查询select * from articles wheretitle like’%2008%’可以查找到,而使用全文检索select * from articles where match(title) against(‘2008’);是检索不到的,由于2008不是1个单词!

 

4)    使用全文检索引擎工具包

采取lucene、Sphinx、solr等专门的全文检索开源工具可以检索某段字符串。



本章结束,下1章将回归数据库的开起源头――设计好1张表。
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生