在 mysql 中索引文本是不是可以改善使用 LIKE '%search%' 的搜索文本

Posted

技术标签:

【中文标题】在 mysql 中索引文本是不是可以改善使用 LIKE \'%search%\' 的搜索文本【英文标题】:Does indexing a text in mysql improve searching text with LIKE '%search%'在 mysql 中索引文本是否可以改善使用 LIKE '%search%' 的搜索文本 【发布时间】:2012-06-09 06:33:03 【问题描述】:

我在 mysql version:5.1.61-community-log 中使用 InnoDB 引擎。要搜索的文本长度小于 100 个字符。 LIKE '%searchstring%' 查询的性能是否会随着对文本的索引而提高?

编辑: 我正在将此查询用于 jquery 自动建议组件。 我正在使用 3rd 方虚拟主机服务。所以升级不是我的选择

【问题讨论】:

【参考方案1】:

不,添加索引不会帮助您的LIKE '%foo%' 查询(很多*)。 LIKE 条件只有在你有一个常量前缀的情况下才能有效地使用索引,例如LIKE 'foo%'

您应该考虑使用full text search。如果您使用的是 MySQL 5.5 或更早版本,则仅支持 MyISAM 引擎。在 MySQL 5.6 或更新版本中,InnoDB 也支持全文搜索。

如果您使用的是旧版本的 MySQL,无法升级,无法更改存储引擎(因为您需要 InnoDB 的其他功能,例如外键约束),那么您可以考虑创建一个新的 MyISAM 表它只存储主键和文本列。如果您还需要访问其他列,则可以使用此表执行快速全文搜索并加入原始表。

您也可以考虑使用外部文本搜索引擎,例如:

Sphinx Lucene

(*) 如果您添加的索引是您的查询的覆盖索引,您将通过添加索引获得小幅改进。由于索引的宽度较小,因此对索引进行全扫描会比全表全扫描快。

【讨论】:

参考全文中给出的只能与MyISAM一起使用。我其余的表使用 InnoDB 引擎。在一个表中使用 MyISAM 并在其余表中使用 InnoDB 会是一个好主意吗?该表与其他表进行了很多内部联接。 @Terminal:如果您使用的是 MySQL 5.5 或更低版本,则只能将全文搜索与 MyISAM 引擎一起使用。在 MySQL 5.6 中也支持 InnoDB。您使用的是什么版本的 MySQL?是升级选项吗? 我当前的 mysql 版本:5.1.61-community-log 。我正在使用虚拟主机服务,所以升级不适合我

以上是关于在 mysql 中索引文本是不是可以改善使用 LIKE '%search%' 的搜索文本的主要内容,如果未能解决你的问题,请参考以下文章

检索数组的最后一个数字(不是索引) - PHP 和 MySQL

阿里二面:MySQL索引是怎么支撑千万级表的快速查找?

改善网站的十点建议

MySQL索引是怎么支撑千万级表的快速查找(一.外存储器-磁盘)

mysql 查看索引使用情况

MySQL调优4---索引