当前位置: 首页 > 面试题库 >

在innoDB中优化MySQL LIKE'%string%'查询

宗政安歌
2023-03-14
问题内容

有此表:

CREATE TABLE `example` (
`id` int(11) unsigned NOT NULL auto_increment,
`keywords` varchar(200) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

我们想优化以下查询:

SELECT id FROM example WHERE keywords LIKE '%whatever%'

该表是InnoDB,(因此暂时没有FULLTEXT),这将是优化此类查询的最佳索引?

我们尝试了一个简单的方法

ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`);

但是一个解释性查询表明, 如果我们的查询在“像%%”这样的地方查询,则需要扫描 整个表 ,该索引表现良好,但否则就没有价值。

无论如何,有没有为innoDB优化呢?

谢谢!


问题答案:

索引是从字符串的开头到结尾建立的。使用LIKE 'whatever%'type子句时,MySQL可以使用那些基于开始的索引whatever快速查找。

但是切换到LIKE '%whatever%'会删除字符串开头的锚点。现在,无法使用基于开始的索引,因为您的搜索词不再锚定在字符串的开头-它“浮动”在中间的某个位置,必须搜索整个字段。任何LIKE '%...查询都不能使用索引。

这就是为什么如果您所做的只是“浮动”搜索,就使用全文索引的原因,因为它们是针对此类使用而设计的。

需要特别注意的是:从5.6.4版本开始,InnoDB现在支持全文索引。因此,除非您不能升级到至少5.6.4,否则您将无法使用InnoDB *
全文本搜索。



 类似资料:
  • 本文向大家介绍浅谈MyISAM 和 InnoDB 的区别与优化,包括了浅谈MyISAM 和 InnoDB 的区别与优化的使用技巧和注意事项,需要的朋友参考一下 MyISAM 和 InnoDB 的基本区别 1.InnoDB不支持FULLTEXT类型的索引。 2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算

  • 问题内容: 我希望从我的用户模型中检索一些信息,如下所示: 在主页中,我有一个 位置 过滤器,您可以在其中浏览来自国家或城市的用户。 所有字段还包含其中的用户数: 在主页上,然后我还有“学生和老师”页面,我希望仅提供有关这些国家和城市有多少老师的信息… 我想做的是创建一个对MongoDB的查询,以通过单个查询检索所有这些信息。 此刻查询如下: 问题是我不知道如何获取所需的所有信息。 我不知道如何获

  • 问题内容: 此查询需要153秒才能运行。中有数百万行。 我认为查询要花很长时间,因为where子句中的功能。但是,我需要在列上执行ltrim rtrim,而且日期也必须在格式上匹配。如何优化此查询? 说明计划: 首要的关键: 索引: 但是,在解释计划中,我看不到使用索引/主键。那是问题吗? 问题答案: 试试这个: 如果尚无时间,请从其外观(出生日期?)上删除该对象。除此之外,您还需要一些索引工作。

  • 主要内容:概述,一、关联查询优化,1.左(右)外连接,2.内连接,3.JOIN语句原理,4.JOIN小结,5.Hash Join,二、子查询优化,三、排序优化,四、GROUP BY优化,五、优先考虑覆盖索引,六、使用前缀索引,七、索引下推ICP,八、其他查询优化,1.COUNT(*)与COUNT(具体字段)效率,2.不使用SELECT *,3.LIMIT 1优化,4.多使用commit概述 数据库调优的方式有多种: 建立索引、充分利用到索引、不让索引失效 对SQL语句进行优化 调优如缓冲、线程数

  • 我有一个Spark作业,它使用以下分组查询。我知道group by是邪恶的,但在我的用例中我无法避免它。我尝试使用数据帧和hiveContext来使用它。sql()但这两种方法都会洗牌大量数据,而且速度非常慢:一个查询大约需要5分钟。我曾看到一组按阶段执行20 GB的随机读取和10 GB的随机写入。我有大约8个字段按字段分组传入 或 我已经尝试了几乎所有的调谐参数,如钨丝、lz4等。洗牌memor

  • 问题内容: 我有一个小而狭窄的InnoDB表,大约有900万条记录。在桌子上或桌子上做的速度非常慢(超过6秒): 虽然该语句不是运行得太频繁,但对其进行优化将是不错的选择。根据http://www.cloudspace.com/blog/2009/08/06/fast- mysql-innodb-count-really- fast/, 这可以通过强制InnoDB使用索引来实现: 解释计划似乎很好