MySQL - 字符串比较的索引

时间:2016-07-27 03:24:20

标签: mysql indexing

这适用于带有MySQL 5.7的InnoDB。

如果我有这样的查询:

D

查询可以使用@posts = Post.includes(:course).where("courses.name IN (#{@user.courses.map(&:name).collect { |s| '#{s}' }.join(',') })").references(:courses).order("posts.created_at DESC") 上的索引吗?即MySQL是否足够聪明,可以将btree索引用于STRCMP功能?

如果没有,我怎么能够重新设计查询(和/或表),以便我可以在D上进行字符串比较,并且可以进行某种形式的修剪,这样就不必每行都有一个?

4 个答案:

答案 0 :(得分:3)

到目前为止有多少错误答案。让我看看我是否不能加入他们。

STRCMP返回-1,0或1,具体取决于参数的比较方式。

STRCMP(D, 'somestring') > 0D > 'somestring'相同。 (不是>=,不是=,不是LIKE

实际上,可能是整理差异,但必要时可以处理。

任何函数和某些运算符都会“隐藏”列与INDEXes一起使用。 D > 'somestring'可以从以D开头的索引中受益; STRCMP版本不能。

答案 1 :(得分:2)

为什么不

WHERE D > 'somestring'

这将利用列D上的典型B树索引。

答案 2 :(得分:1)

如果仅通过将列值传递给STRCMP()等函数来执行比较,则索引它没有任何价值。

参考:https://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

B树索引可用于使用=>>=<<=的表达式中的列比较,或者BETWEEN运营商。

所以,你可以使用

SELECT A, B, C FROM TABLE WHERE D > 'somestring'

相反,虽然LIKE更严格,可能是您所期望的。

此外,您可以使用COLLATE运算符将列转换为区分大小写的排序规则,以确保它也会比较案例。

SELECT A, B, C FROM TABLE WHERE D > 'somestring' COLLATE utf8_bin

答案 3 :(得分:0)

Mysql不会使用索引进行函数调用。

D

上使用以下查询并创建索引
SELECT A, B, C FROM TABLE WHERE D ='somestring'

创建索引使用以下查询

 create index index1 on TABLE(D);