设为首页 加入收藏

TOP

数据库调优教程(十)【精华章节】解决like’%str’时索引不被使用的4种方法
2015-07-24 11:56:05 来源: 作者: 【 】 浏览:4
Tags:数据库 教程 精华 章节 解决 like %str 索引 使用 方法

三、 索引

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等专门的全文检索开源工具可以检索某段字符串。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇机房收费系统VB版(一)――系统.. 下一篇笛卡尔集基本原理,等值连接,不..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Sphinx : 高性能SQL (2025-12-24 10:18:11)
·Pandas 性能优化 - (2025-12-24 10:18:08)
·MySQL 索引 - 菜鸟教 (2025-12-24 10:18:06)
·Shell 基本运算符 - (2025-12-24 09:52:56)
·Shell 函数 | 菜鸟教 (2025-12-24 09:52:54)