2016-07-27 56 views
2

这是InnoDB与MySQL 5.7的。MySQL - 索引字符串比较

如果我有这样的查询:

SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0 

是否有可能具有可以通过查询使用上D的指数?即MySQL是否足够聪明,可以为STRCMP函数使用btree索引?

如果不是,我怎么能够重新设计查询(和/或表),以便我可以对D进行字符串比较,并且可以有某种形式的修剪,以便它不必击中每一个行?

+0

用途:WHERE D like%somestring% – kollein

+0

@kollein:对不起,但是这个评论又是如何相关?首先,由于前缀变量,%somestring%会关闭索引。其次,我试图做字符串比较,而不是子字符串匹配。 –

回答

3

惊奇的是许多错误的答案为止。让我看看我不能加入他们。

STRCMP根据参数比较的方式返回-1,0或1。

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

实际上,有可能核对的差异,但是这可以根据需要被处理。

任何函数和某些操作符都可以使用INDEXes来“隐藏”列。 D > 'somestring'可受益于从D开始的索引; STRCMP版本不能。

+0

谢谢@ rick-james! (还可以使用@ydoow和@ mike-bryant)。这可能听起来很愚蠢,但我不知道“>”等可以用在字符串操作数上! –

0

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

使用下面的查询和报告d

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

创建索引使用下面的查询

create index index1 on TABLE(D); 
2

为什么不

WHERE D > 'somestring' 

这将充分利用创建索引典型B树索引列D

1

如果仅通过将列值传递给诸如STRCMP()之类的函数来执行比较,那么在对其进行索引时没有值。

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

A 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

+0

没有通配符的'LIKE'与'='相同。我认为OP的意图是作为一种排序机制 - 返回所有记录,其中D大于(以字母数字排序术语)与表记录进行比较的字符串。 –

+0

感谢@MikeBrant指出。我忽略了这个问题,并且弄错了。相应地更正了答案。 – ydoow