【问题标题】:Best type of indexing when there is LIKE clause [duplicate]有 LIKE 子句时的最佳索引类型[重复]
【发布时间】:2017-05-09 08:47:07
【问题描述】:

这是我的查询:

SELECT name, usage_guidance, total_used_num
FROM tags
WHERE
 ( name LIKE CONCAT('%', ?, '%') OR
   usage_guidance LIKE CONCAT(?, '%') )
 AND name NOT IN ($in)
ORDER BY name LIKE CONCAT('%', ?, '%') DESC, name ASC
LIMIT 6

哪个是最好的索引?

  • tags(name,usage_guidance)
  • tags(usage_guidance,name)
  • tags(name)
  • tags(usage_guidance)

或者有没有更好的选择?!你知道,当LIKE 出现时,我对创建索引感到困惑。因为LIKE %something 永远不会从索引中受益。同样在上面的查询中,我有ANDORIN ..这就是为什么我问这个问题也想知道你对它的看法。


这是我的表结构:

CREATE TABLE `tags` (
    `id` int(11) NOT NULL,
    `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `usage_guidance` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `parent_id` int(11) UNSIGNED DEFAULT NULL,
    `related` int(11) UNSIGNED DEFAULT NULL,
    `total_used_num` int(11) UNSIGNED NOT NULL,
    `date_time` int(11) UNSIGNED NOT NULL
)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

我正在尝试进行自动完成建议查询。像这样的:

【问题讨论】:

  • @barmar,使用 full-text 不适合我正在寻找的内容.. 因为 full-text 不支持基于一个字母的搜索..!
  • 如果你不能使用 FTS,那你就太不走运了。无法索引以 % 开头的搜索。
  • 也许这就是 SO 不使用 MySQL 的原因。
  • @Barmar ..!哦真的吗?!所以不使用MySQL?!妈的……!我以为是的。实际上,我正在尝试制作一个类似于 SO 的网站。那么它使用的是什么数据库?

标签: mysql indexing


【解决方案1】:

是的,你这里有一个数据库杀手

B 树索引可用于表达式中的列比较 使用 =、>、>=、

来源:http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html

这意味着您的 LIKE 查询不能使用索引,然后您有两个用 OR 连接的喜欢。如果这还不够,您还需要进行 NOT IN 比较。

但幸运的是,第二个 LIKE 表达式还不错,它没有以通配符开头。所以你最好的希望是在usage_guidance, name上创建一个复合索引

如果您可以发布您的 SHOW CREATE TABLE 和几行示例数据 + 预期输出,我们可能会知道是否有办法重写此查询。

【讨论】:

  • 谢谢 .. upvote .. 另外请看一下我的问题的更新版本,告诉我可以更好地编写该查询吗?
  • 从您的更新来看,您的查询可能不会从重复指向的全文搜索中受益。编辑问题以反映这一点,我将重新投票。
猜你喜欢
  • 2010-10-18
  • 2012-03-30
  • 2016-06-23
  • 2011-07-18
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2017-08-30
相关资源
最近更新 更多