mysql – 有LIKE子句时的最佳索引类型

参见英文答案 > improve performance for LIKE clause                                    3个
这是我的查询:

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

哪一个是最好的指数?

>标签(name,usage_guidance)
>标签(usage_guidance,name)
>标签(名称)
>标签(usage_guidance)

或者有更好的选择吗?!你知道,当LIKE进来时,我对创建索引感到困惑.因为LIKE%的东西永远不会带来索引的任何好处.同样在上面的查询中,我有AND,OR和IN ..这就是为什么我问这个问题也知道你对它的看法.

这是我的表结构:

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;

我正在尝试制作自动填充建议查询.像这样的东西:

mysql  – 有LIKE子句时的最佳索引类型

解决方法:

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

A B-tree index can be used for column comparisons in expressions that
use the =, >, >=, <, <=, or BETWEEN operators. The index also can be
used for LIKE comparisons if the argument to LIKE is a constant string
that does not start with a wildcard character.

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

这意味着你的LIKE查询不能使用索引,然后你有两个喜欢用OR连接.如果这还不够,那么你也会进行NOT IN比较.

但幸运的是,第二个LIKE表达式并不是那么糟糕,它不是以通配符开头的.所以你最好的希望是在usage_guidance,name上创建一个复合索引

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

上一篇:python – pandas loc vs. iloc vs. ix vs. at vs. iat?


下一篇:如何向MySQL表添加索引?