ITPub博客

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

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

MySQL 作者:pentium 时间:2020-01-14 09:54:56 0 删除 编辑

三、           索引



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




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


如下




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


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




1)    Select主键


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


比如下面的


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


就使用了索引


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


则不使用索引




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


比如下面这种是不会使用索引的



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



2)    覆盖索引法


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


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


创建覆盖索引



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




注意:


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


 


3)    全文索引法


此方法有较大局限。


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


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


少于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不是一个单词!


 


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


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




本章结束,下一章将回归数据库的开发源头——设计好一张表。

————————————————

版权声明:本文为CSDN博主「SexyCode」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/hzy38324/article/details/44975859


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14377/viewspace-2673227/,如需转载,请注明出处,否则将追究法律责任。

上一篇: powerdesigner 画ER图
下一篇: 三范式
请登录后发表评论 登录
全部评论

注册时间:2010-09-30

  • 博文量
    191
  • 访问量
    287586