这适用于带有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上进行字符串比较,并且可以进行某种形式的修剪,这样就不必每行都有一个?
答案 0 :(得分:3)
到目前为止有多少错误答案。让我看看我是否不能加入他们。
STRCMP
返回-1,0或1,具体取决于参数的比较方式。
STRCMP(D, 'somestring') > 0
与D > '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);