【问题标题】:Can I create a MySQL index for LIKE searches with both left and right wildcards?我可以使用左右通配符为 LIKE 搜索创建 MySQL 索引吗?
【发布时间】:2015-07-22 11:24:53
【问题描述】:

我使用的是 MySQL 5.5.37。我有一个有列的表

`NAME` varchar(100) COLLATE utf8_bin NOT NULL

我打算对名称列进行部分搜索,例如

select * FROM organnization where name like ‘%abc%’

请注意,我想搜索字符串“abc”是否出现在任何地方,不一定在开头。鉴于此,我可以在列上使用任何索引来优化查询执行吗?

【问题讨论】:

  • 不,这是不可能的。也许你想要的是全文索引?
  • 我很困惑——你说它不可能,然后你提出一种可能的方法?您能否举例说明如何实现?
  • 全文索引可以匹配单词,而不是随机字符串。
  • 是的,搜索的不一定是单词,可能只是单词的一部分。

标签: mysql search indexing sql-like


【解决方案1】:

如果您只期望几个匹配的结果,您仍然可以在 name 列上创建索引以加快查询速度,并借助主键。

如果你的表有一个像这样的主键

org_id int not null auto_increment 主键, 名称 varchar(100) 整理 utf8_bin 不为空, desc varchar(200) 整理 utf8_bin 非空, 大小整数, ....

您可以在 (name, org_id) 上创建索引

然后像这样进行查询:

select * from orgnizations o1 join (select org_id from orgnizations where name like '%abcd%' ) o2 using (org_id) 

应该比你原来的查询更快

如果您只需要一两个其他列进行名称搜索,您可以将这些列包含在您的名称索引中并执行类似的查询

select org_id, name, size from orgnizations where name like '%abcd%'

仍然会比全表扫描快得多

【讨论】:

  • 我对结果的数量没有期望。可能很少,但可能很多。
  • 只要您的 '%abcd%' 搜索返回相对较小的数据集,您就应该进行索引扫描而不是表扫描。真正的阈值取决于您的数据,但如果您预计大多数搜索将匹配不到 10% 的记录,则索引扫描可能会有所帮助。但它并不完美,仍然需要一些时间才能完成。如果你想在亚秒级内搜索数百万条记录的表,你可能需要使用关键字表建立索引,类似于全文索引。
猜你喜欢
  • 2020-12-04
  • 2021-11-30
  • 2011-01-06
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
相关资源
最近更新 更多